From e3d7ec787c2a2b03af577fa151cf78f951a6ae66 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Thu, 23 Feb 2023 11:46:42 +0800
Subject: [PATCH] 百度的地址识别

---
 src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java                            |   64 ++++++++++++
 src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java         |    3 
 src/test/java/cc/mrbird/febs/AgentTest.java                                       |   87 ++++++++++++++++-
 src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java    |    8 +
 src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java                  |   16 +++
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java |   38 +++++++
 src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java              |   55 +++++++++++
 src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java                        |    1 
 8 files changed, 267 insertions(+), 5 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java b/src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java
index 35c2505..ada2056 100644
--- a/src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java
+++ b/src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java
@@ -5,6 +5,8 @@
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.properties.FebsProperties;
 import cc.mrbird.febs.common.properties.ValidateCodeProperties;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.wf.captcha.GifCaptcha;
 import com.wf.captcha.SpecCaptcha;
 import com.wf.captcha.base.Captcha;
@@ -18,6 +20,8 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 验证码服务
@@ -77,4 +81,55 @@
         response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache");
         response.setDateHeader(HttpHeaders.EXPIRES, 0L);
     }
+
+
+//    public static void main(String[] args) {
+//        List<Integer> lists = new ArrayList<>();
+////        lists.add(1);
+////        lists.add(2);
+////        lists.add(3);
+////        lists.add(4);
+//        System.out.println(lists);
+//        List<Integer> collect = lists
+//                .stream()
+//                .filter(list -> 1 == list)
+//                .collect(Collectors.toList());
+//
+//        System.out.println(collect);
+//
+//        List<Integer> collect1 = lists.stream().filter(
+//                list -> {
+//                    if (1 != list) {
+//                        return true;
+//                    }
+//                    return false;
+//                }
+//        ).collect(Collectors.toList());
+//
+//        System.out.println(collect1);
+//
+//
+//        List<Integer> list2 = new ArrayList<>();
+//        Random rd = new Random();
+//        for (int i = 0; i < 100; i++) {
+//            list2.add(rd.nextInt(101));// 随机产生一个[0,100]的数字
+//        }
+//        System.out.println(list2);
+//        // 流处理, 进行数据处理
+//        DoubleSummaryStatistics ds = list2.stream().collect(Collectors.summarizingDouble(e -> e));
+//        Map<Boolean, List<Integer>> collect2 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 60));
+//        Map<Boolean, List<Integer>> collect3 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 80));
+//        Map<Boolean, List<Integer>> collect4 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 200));
+//        System.out.println("平均分"+ds.getAverage());
+//        System.out.println("最高分"+ds.getMax());
+//        System.out.println("最低分"+ds.getMin());
+//        System.out.println("总分"+ds.getSum());
+//        System.out.println("人数"+ds.getCount());
+//        System.out.println("大于60分"+collect2.toString());
+//        System.out.println("大于80分"+collect3.get(true).toString());
+//        System.out.println("大于90分"+collect4.get(true).toString());
+//        JSONObject jsonObject = JSONUtil.parseObj(collect2);
+//        System.out.println(jsonObject);
+//
+//    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java
index 6130cf7..8305013 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.mall.conversion.MallAddressInfoConversion;
 import cc.mrbird.febs.mall.dto.AddressInfoDto;
+import cc.mrbird.febs.mall.dto.ApiIdentifyAddressDto;
 import cc.mrbird.febs.mall.entity.MallAddressInfo;
 import cc.mrbird.febs.mall.service.IApiMallAddressInfoService;
 import cc.mrbird.febs.mall.vo.AddressInfoVo;
@@ -15,6 +16,7 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -77,4 +79,10 @@
         return new FebsResponse().success().message("设置成功");
     }
 
+    @ApiOperation(value = "智能识别地址", notes = "智能识别地址")
+    @PostMapping(value = "/identifyAddress")
+    public FebsResponse identifyAddress(@RequestBody  @Valid ApiIdentifyAddressDto identifyAddressDto) {
+        return mallAddressInfoService.identifyAddress(identifyAddressDto);
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java
new file mode 100644
index 0000000..db2b225
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "ApiIdentifyAddressDto", description = "地址接收参数类")
+public class ApiIdentifyAddressDto {
+
+
+    @NotBlank(message = "参数不能为空")
+    private String text;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java
new file mode 100644
index 0000000..d9c2125
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java
@@ -0,0 +1,64 @@
+package cc.mrbird.febs.mall.quartz;
+
+import cc.mrbird.febs.common.utils.RedisUtils;
+import cc.mrbird.febs.pay.util.WechatConfigure;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.exceptions.ApiException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+@ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true")
+public class BaiduJob {
+
+    @Autowired
+    private RedisUtils redisUtils;
+    @Resource
+    RestTemplate restTemplate;
+
+    @Scheduled(cron = "0 0 1 * * ? ")
+    public void getAccessToken(){
+        // 官网获取的 API Key 更新为你注册的
+        String clientId = "MPHXcBxkGLIDOmoaahS9pIB7";
+        // 官网获取的 Secret Key 更新为你注册的
+        String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
+        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
+        String getAccessTokenUrl = authHost
+                // 1. grant_type为固定参数
+                + "grant_type=client_credentials"
+                // 2. 官网获取的 API Key
+                + "&client_id=" + clientId
+                // 3. 官网获取的 Secret Key
+                + "&client_secret=" + clientSecret;
+        String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class);
+
+        /**
+         * 返回结果
+         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
+         */
+        if (!jsonStr.contains("access_token")) {
+            System.out.println("获取access_token失败");
+        }
+        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+        String accessToken = jsonObject.getString("access_token");
+
+        String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY;
+        if (StrUtil.isEmpty(accessToken)) {
+            log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg"));
+            throw new ApiException("获取access token失败");
+        } else {
+            log.info("baidu access_token : {}",accessToken);
+            System.out.println(accessToken);
+            redisUtils.set(accessTokenKey,accessToken);
+        }
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java
index d4d5a65..bd88226 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java
@@ -2,6 +2,7 @@
 
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.mall.dto.AddressInfoDto;
+import cc.mrbird.febs.mall.dto.ApiIdentifyAddressDto;
 import cc.mrbird.febs.mall.entity.MallAddressInfo;
 import cc.mrbird.febs.mall.vo.AddressInfoVo;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -17,4 +18,6 @@
     void modifyAddress(AddressInfoDto addressInfoDto);
 
     void setDefaultAddress(Long id);
+
+    FebsResponse identifyAddress(ApiIdentifyAddressDto identifyAddressDto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java
index 4ebfcd9..e9118ea 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java
@@ -3,20 +3,29 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.mall.conversion.MallAddressInfoConversion;
 import cc.mrbird.febs.mall.dto.AddressInfoDto;
+import cc.mrbird.febs.mall.dto.ApiIdentifyAddressDto;
 import cc.mrbird.febs.mall.entity.MallAddressInfo;
 import cc.mrbird.febs.mall.entity.MallMember;
 import cc.mrbird.febs.mall.mapper.MallAddressInfoMapper;
 import cc.mrbird.febs.mall.service.IApiMallAddressInfoService;
 import cc.mrbird.febs.mall.vo.AddressInfoVo;
+import cc.mrbird.febs.pay.util.WechatConfigure;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -27,6 +36,9 @@
 @Service
 @RequiredArgsConstructor
 public class ApiMallAddressInfoServiceImpl extends ServiceImpl<MallAddressInfoMapper, MallAddressInfo> implements IApiMallAddressInfoService {
+
+    @Autowired
+    private RedisUtils redisUtils;
 
     @Override
     public List<AddressInfoVo> findAddressInfoList() {
@@ -88,4 +100,30 @@
 
         this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_Y, member.getId(), id);
     }
+
+    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
+
+    @Override
+    public FebsResponse identifyAddress(ApiIdentifyAddressDto identifyAddressDto) {
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, JSONUtil.toJsonStr(identifyAddressDto));
+        Request request = new Request.Builder()
+                .url("https://aip.baidubce.com/rpc/2.0/nlp/v1/address?access_token=" + redisUtils.get(WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY).toString())
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("Accept", "application/json")
+                .build();
+        String data = "";
+        try {
+            Response response = HTTP_CLIENT.newCall(request).execute();
+            data = response.body().string();
+            if (data.contains("error_code")) {
+                JSONObject jsonObject = JSONUtil.parseObj(data);
+                return new FebsResponse().fail().message("地址识别错误编码:"+jsonObject.get("error_code").toString());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return new FebsResponse().success().data(data);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java b/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
index d59fc37..4c940c8 100644
--- a/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
+++ b/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
@@ -7,6 +7,7 @@
     public static final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";
 
     public static final String WX_ACCESS_TOKEN_REDIS_KEY = "access_token";
+    public static final String BAIDU_ACCESS_TOKEN_REDIS_KEY = "bd_access_token";
 
     public static final String UNIFIEDORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
 
diff --git a/src/test/java/cc/mrbird/febs/AgentTest.java b/src/test/java/cc/mrbird/febs/AgentTest.java
index 553b8b8..7be46b8 100644
--- a/src/test/java/cc/mrbird/febs/AgentTest.java
+++ b/src/test/java/cc/mrbird/febs/AgentTest.java
@@ -5,32 +5,37 @@
 import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.mall.conversion.MallGoodsConversion;
-import cc.mrbird.febs.mall.dto.AddOrderItemDto;
-import cc.mrbird.febs.mall.dto.AgentLevelUpdateDto;
-import cc.mrbird.febs.mall.dto.ApiCreateOrderVerifyDto;
-import cc.mrbird.febs.mall.dto.ApiMallActWinDetailsDto;
+import cc.mrbird.febs.mall.dto.*;
 import cc.mrbird.febs.mall.entity.*;
 import cc.mrbird.febs.mall.mapper.*;
 import cc.mrbird.febs.mall.quartz.ProfitJob;
 import cc.mrbird.febs.mall.service.IAgentService;
 import cc.mrbird.febs.mall.vo.*;
+import cc.mrbird.febs.pay.util.WechatConfigure;
 import cc.mrbird.febs.rabbit.consumer.AgentConsumer;
 import cc.mrbird.febs.rabbit.producter.AgentProducer;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSONObject;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.exceptions.ApiException;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
 import org.aspectj.weaver.loadtime.Agent;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.web.client.RestTemplate;
 
+import javax.annotation.Resource;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
@@ -77,6 +82,78 @@
     private  MallGoodsMapper mallGoodsMapper;
     @Autowired
     private  MallGoodsImagesMapper goodsImagesMapper;
+
+
+    @Autowired
+    private RedisUtils redisUtils;
+    @Resource
+    RestTemplate restTemplate;
+
+    public static final String API_KEY = "MPHXcBxkGLIDOmoaahS9pIB7";
+    public static final String SECRET_KEY = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
+
+    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
+    @Test
+    public void getAccessToken(){
+        ApiIdentifyAddressDto apiIdentifyAddressDto = new ApiIdentifyAddressDto();
+        apiIdentifyAddressDto.setText("上海市浦东新区纳贤路701号百度上海研发中心 F4A000 张三");
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, JSONUtil.toJsonStr(apiIdentifyAddressDto));
+        Request request = new Request.Builder()
+                .url("https://aip.baidubce.com/rpc/2.0/nlp/v1/address?access_token=" + redisUtils.get(WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY).toString())
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("Accept", "application/json")
+                .build();
+        try {
+            Response response = HTTP_CLIENT.newCall(request).execute();
+            String responseStr = response.body().string();
+            System.out.println(responseStr);
+            if (responseStr.contains("error_code")) {
+                System.out.println("获取access_token失败");
+                JSONObject jsonObject = JSONUtil.parseObj(responseStr);
+                System.out.print(jsonObject.get("error_code").toString());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+    @Test
+    public void getAccessToken2(){
+        // 官网获取的 API Key 更新为你注册的
+        String clientId = "MPHXcBxkGLIDOmoaahS9pIB7";
+        // 官网获取的 Secret Key 更新为你注册的
+        String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
+        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
+        String getAccessTokenUrl = authHost
+                // 1. grant_type为固定参数
+                + "grant_type=client_credentials"
+                // 2. 官网获取的 API Key
+                + "&client_id=" + clientId
+                // 3. 官网获取的 Secret Key
+                + "&client_secret=" + clientSecret;
+        String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class);
+
+        /**
+         * 返回结果
+         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
+         */
+        if (!jsonStr.contains("access_token")) {
+            System.out.println("获取access_token失败");
+        }
+        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(jsonStr);
+        String accessToken = jsonObject.getString("access_token");
+
+        String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY;
+        if (StrUtil.isEmpty(accessToken)) {
+            log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg"));
+            throw new ApiException("获取access token失败");
+        } else {
+            log.info("baidu access_token : {}",accessToken);
+            System.out.println(accessToken);
+            redisUtils.set(accessTokenKey,accessToken);
+        }
+    }
     @Test
     public void goodsDetails(){
         Long id = 68L;

--
Gitblit v1.9.1