浏览代码

Merge remote-tracking branch 'origin/master'

zangbin 3 年之前
父节点
当前提交
4aacb1ecb9

+ 1 - 0
lb-app/src/main/java/com/ydd/app/dto/StoreDto.java

@@ -134,5 +134,6 @@ public class StoreDto extends  BaseDto implements Serializable {
      * poi地址
      */
     private String poiAddress;
+    private String cityCode;
 
 }

+ 6 - 2
lb-app/src/main/java/com/ydd/app/service/impl/ApiStoreServiceImpl.java

@@ -80,10 +80,14 @@ public class ApiStoreServiceImpl implements ApiStoreService {
         JSONObject resp = new JSONObject();
         Member member = iMemberService.getById(loginId);
         Map<String, Object> map = AddressLngLatExchanger.addressToLngAndLag(shopReq.getAddress());
+        if(map==null){
+            return ResponseResult.error(ResponseResultCodeEnum.SHOP_ADDRESS_INVALID);
+        }
         double distance = CoordinateUtils.getDistance(Double.parseDouble(map.get("lng") + ""), Double.parseDouble(map.get("lat") + ""), Double.parseDouble(shopReq.getLongitude()), Double.parseDouble(shopReq.getLatitude()));
         if (distance > 50) {
             return ResponseResult.error(ResponseResultCodeEnum.SHOP_ADDRESS_ERROR);
         }
+        shopReq.setCityCode(map.get("cityCode")+"");
         AipOcr client = new AipOcr("23831014", "BELGCxGTPOlcZzeZ85OLyIpD", "pLt8IG1PoXZBaDonLfFM9EkXndI1OBxh");
         String idCardName = "";
         if (StringUtils.isNotBlank(shopReq.getIdcardFront())) {
@@ -219,7 +223,7 @@ public class ApiStoreServiceImpl implements ApiStoreService {
         //  shop.setDoorHeadPhoto(shopReq.getHouseNumber());
         shop.setLat(shopReq.getLatitude());
         shop.setLng(shopReq.getLongitude());
-        // shop.setCityCode(shopReq.getCityCode());
+         shop.setCityCode(shopReq.getCityCode());
         shop.setMobile(shopReq.getContactPhone());
         shop.setName(shopReq.getShopName());
         shop.setStreet(shopReq.getHouseNumber());
@@ -352,7 +356,7 @@ public class ApiStoreServiceImpl implements ApiStoreService {
                 return ResponseResult.error(ResponseResultCodeEnum.SHOP_EXIST);
             }
         }
-
+        storeDto.setCityCode(shop.getCityCode());
         shop = shopBean(shop, storeDto);
         if (storeDto.getCategoryId() != null) {
             shop.setCategoryId(storeDto.getCategoryId());

+ 14 - 0
lb-app/src/main/java/com/ydd/app/service/impl/OpenApiOrderValuationServiceImpl.java

@@ -58,6 +58,8 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
 
     private final IShopService iShopService;
 
+    private final IMerchantService iMerchantService;
+
     private final IMemberService iMemberService;
 
     private final IProductService iProductService;
@@ -103,6 +105,13 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         if (result.getCode() != ResponseResultCodeEnum.SUCCESS.getCode()) {
             return result;
         }
+        Merchant merchant = null;
+        if (valuationDto.getMerchantId() != null) {
+            merchant = iMerchantService.getById(valuationDto.getMerchantId());
+            if (merchant == null) {
+                return ResponseResult.error(ResponseResultCodeEnum.MERCHANT_DISABLE);
+            }
+        }
         Product product = iProductService.getById(valuationReq.getCategoryId());
         if (product == null) {
             return ResponseResult.error(ResponseResultCodeEnum.CATEGORY_NOT_EXIST);
@@ -129,6 +138,10 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         if (CollectionUtils.isNotEmpty(disableDeliveryTypes)) {
             types.removeAll(disableDeliveryTypes);
         }
+        // 开放平台个人发单, 不发美团和蜂鸟
+        if (merchant != null && merchant.getAppId() != null && StringUtils.isBlank(valuationReq.getShopCode())) {
+            types.removeAll(Arrays.asList(2, 3));
+        }
         // 获取可用发单运力
         List<DeliveryInfo> deliveryInfos = this.getDeliveryInfos(valuationDto, types);
         if (CollectionUtils.isEmpty(deliveryInfos)) {
@@ -732,6 +745,7 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
             valuationReq.setSendHouseNumber(shop.getStreet());
             valuationReq.setSendLat(shop.getLat());
             valuationReq.setSendLng(shop.getLng());
+            valuationReq.setSendCityCode(shop.getCityCode());
 
             valuationDto.setShopId(shop.getId());
             valuationDto.setShopName(shop.getName());

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

@@ -45,7 +45,7 @@ public enum ResponseResultCodeEnum {
     USER_MOBILE_EXIST(2016, "手机号码已注册"),
     VALUATION_ERR(2021, "计价失败"),
     REFRESH_TOKEN_INVALID(2022, "token已失效"),
-
+    SHOP_ADDRESS_INVALID(2023, "地址解析失败"),
 
     VALUATION_INVALID(2030, "计价已失效, 请重新计价"),
     AMOUNT_NOT_ENOUGH(2031, "账户余额不足"),

+ 199 - 0
lb-gateway/src/main/java/com/ydd/gateway/filter/RequestParamGlobalFilter.java

@@ -0,0 +1,199 @@
+package com.ydd.gateway.filter;
+
+import com.ydd.gateway.service.GatewayContext;
+import io.netty.buffer.ByteBufAllocator;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.core.io.buffer.NettyDataBufferFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.codec.HttpMessageReader;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
+import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.reactive.function.server.HandlerStrategies;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wangtao
+ * @date 2022/4/1
+ */
+@Component
+public class RequestParamGlobalFilter implements GlobalFilter, Ordered {
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+
+        /**
+         * save request path and serviceId into gateway context
+         */
+        ServerHttpRequest request = exchange.getRequest();
+        HttpHeaders headers = request.getHeaders();
+
+        // 处理参数
+        MediaType contentType = headers.getContentType();
+        long contentLength = headers.getContentLength();
+
+        if (contentLength > 0) {
+            if (MediaType.APPLICATION_JSON.equals(contentType) || MediaType.APPLICATION_JSON_UTF8.equals(contentType)) {
+                return readBody(exchange, chain);
+            }
+            if (MediaType.APPLICATION_FORM_URLENCODED.equals(contentType) || MediaType.APPLICATION_JSON_UTF8.equals(contentType)) {
+                GatewayContext gatewayContext = new GatewayContext();
+                return readFormData(exchange, chain,gatewayContext);
+            }
+        }
+
+        return chain.filter(exchange);
+    }
+
+
+    /**
+     * default HttpMessageReader
+     */
+    private static final List<HttpMessageReader<?>> messageReaders = HandlerStrategies.withDefaults().messageReaders();
+    /**
+     * ReadJsonBody
+     *
+     * @param exchange
+     * @param chain
+     * @return
+     */
+    private Mono<Void> readBody(ServerWebExchange exchange, GatewayFilterChain chain) {
+        /**
+         * join the body
+         */
+        return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {
+            byte[] bytes = new byte[dataBuffer.readableByteCount()];
+            dataBuffer.read(bytes);
+            DataBufferUtils.release(dataBuffer);
+            Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
+                DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
+                DataBufferUtils.retain(buffer);
+                return Mono.just(buffer);
+            });
+            /**
+             * repackage ServerHttpRequest
+             */
+            ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
+                @Override
+                public Flux<DataBuffer> getBody() {
+                    return cachedFlux;
+                }
+            };
+            /**
+             * mutate exchage with new ServerHttpRequest
+             */
+            ServerWebExchange mutatedExchange = exchange.mutate().request(mutatedRequest).build();
+            /**
+             * read body string with default messageReaders
+             */
+            return ServerRequest.create(mutatedExchange, messageReaders).bodyToMono(String.class)
+                    .doOnNext(objectValue -> {
+//                        log.debug("[GatewayContext]Read JsonBody:{}", objectValue);
+                    }).then(chain.filter(mutatedExchange));
+        });
+    }
+
+    private Mono<Void> readFormData(ServerWebExchange exchange, GatewayFilterChain chain, GatewayContext gatewayContext){
+        HttpHeaders headers = exchange.getRequest().getHeaders();
+        exchange.getAttributes().put(GatewayContext.CACHE_GATEWAY_CONTEXT,gatewayContext);
+        return exchange.getFormData()
+                .doOnNext(multiValueMap -> {
+                    gatewayContext.setFormData(multiValueMap);
+                })
+                .then(Mono.defer(() -> {
+                    Charset charset = headers.getContentType().getCharset();
+                    charset = charset == null? StandardCharsets.UTF_8:charset;
+                    String charsetName = charset.name();
+                    MultiValueMap<String, String> formData = gatewayContext.getFormData();
+                    /**
+                     * formData is empty just return
+                     */
+                    if(null == formData || formData.isEmpty()){
+                        return chain.filter(exchange);
+                    }
+                    StringBuilder formDataBodyBuilder = new StringBuilder();
+                    String entryKey;
+                    List<String> entryValue;
+                    try {
+                        /**
+                         * repackage form data
+                         */
+                        for (Map.Entry<String, List<String>> entry : formData.entrySet()) {
+                            entryKey = entry.getKey();
+                            entryValue = entry.getValue();
+                            if (entryValue.size() > 1) {
+                                for(String value : entryValue){
+                                    formDataBodyBuilder.append(entryKey).append("=").append(URLEncoder.encode(value, charsetName)).append("&");
+                                }
+                            } else {
+                                formDataBodyBuilder.append(entryKey).append("=").append(URLEncoder.encode(entryValue.get(0), charsetName)).append("&");
+                            }
+                        }
+                    }catch (UnsupportedEncodingException e){
+                        //ignore URLEncode Exception
+                    }
+                    /**
+                     * substring with the last char '&'
+                     */
+                    String formDataBodyString = "";
+                    if(formDataBodyBuilder.length()>0){
+                        formDataBodyString = formDataBodyBuilder.substring(0, formDataBodyBuilder.length() - 1);
+                    }
+                    /**
+                     * get data bytes
+                     */
+                    byte[] bodyBytes =  formDataBodyString.getBytes(charset);
+                    int contentLength = bodyBytes.length;
+                    ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(
+                            exchange.getRequest()) {
+                        /**
+                         * change content-length
+                         * @return
+                         */
+                        @Override
+                        public HttpHeaders getHeaders() {
+                            HttpHeaders httpHeaders = new HttpHeaders();
+                            httpHeaders.putAll(super.getHeaders());
+                            if (contentLength > 0) {
+                                httpHeaders.setContentLength(contentLength);
+                            } else {
+                                httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
+                            }
+                            return httpHeaders;
+                        }
+
+                        /**
+                         * read bytes to Flux<Databuffer>
+                         * @return
+                         */
+                        @Override
+                        public Flux<DataBuffer> getBody() {
+                            return DataBufferUtils.read(new ByteArrayResource(bodyBytes),new NettyDataBufferFactory(ByteBufAllocator.DEFAULT),contentLength);
+                        }
+                    };
+                    ServerWebExchange mutateExchange = exchange.mutate().request(decorator).build();
+                    return chain.filter(mutateExchange);
+                }));
+    }
+    @Override
+    public int getOrder() {
+        return HIGHEST_PRECEDENCE;
+    }
+}

+ 3 - 2
lb-third/lb-third-common/src/main/java/com/ydd/third/common/utils/AddressLngLatExchanger.java

@@ -38,8 +38,9 @@ public class AddressLngLatExchanger {
             location = c.get("location").toString();
             cityCode = c.get("citycode").toString();
         } catch (Exception e) {
-            e.printStackTrace();
-            //  System.out.println("失败!");
+         //   e.printStackTrace();
+            log.error("解析地址失败",e);
+            return null;
         }
         return stringToMap(location, cityCode);
     }