Pārlūkot izejas kodu

短信用户投诉分析查询接口测试

weijianghai 2 gadi atpakaļ
vecāks
revīzija
6ba5a4b9f7
39 mainītis faili ar 843 papildinājumiem un 552 dzēšanām
  1. 1 1
      .gitignore
  2. 10 3
      pom.xml
  3. 47 25
      src/main/java/com/nokia/domainb/capability/UsercomplaintQuerys.java
  4. 37 28
      src/main/java/com/nokia/domainb/config/ControllerExceptionHandler.java
  5. 13 36
      src/main/java/com/nokia/domainb/config/LogAspectConfig.java
  6. 26 0
      src/main/java/com/nokia/domainb/config/ValidatorConfig.java
  7. 4 4
      src/main/java/com/nokia/domainb/service/DomainService.java
  8. 21 0
      src/main/java/com/nokia/domainb/util/AESUtil.java
  9. 0 10
      src/main/resources/data/10.txt
  10. 1 1
      src/test/java/com/nokia/domainb/capability/BlacklistApiRemoveTest.java
  11. 19 20
      src/test/java/com/nokia/domainb/capability/ForeignproductTest.java
  12. 6 7
      src/test/java/com/nokia/domainb/capability/GetEcreditTest.java
  13. 5 6
      src/test/java/com/nokia/domainb/capability/PkgValueTest.java
  14. 5 5
      src/test/java/com/nokia/domainb/capability/QryOweFeeTest.java
  15. 51 2
      src/test/java/com/nokia/domainb/capability/QryRouteAllTest.java
  16. 0 20
      src/test/java/com/nokia/domainb/capability/QryUserIsUdmTest.java
  17. 2 40
      src/test/java/com/nokia/domainb/capability/QryUserProdMsgTest.java
  18. 1 1
      src/test/java/com/nokia/domainb/capability/SmsBlacklistQueryTest.java
  19. 12 13
      src/test/java/com/nokia/domainb/capability/SpThreePartCheckTest.java
  20. 98 128
      src/test/java/com/nokia/domainb/capability/UsercomplaintQuerysTest.java
  21. 57 0
      src/test/java/com/nokia/domainb/capability/config/TestConfig.java
  22. 150 202
      src/test/java/com/nokia/domainb/capability/controller/DomainControllerTest.java
  23. 267 0
      src/test/java/com/nokia/domainb/capability/sdk/SdkConcurrentTest.java
  24. 10 0
      test/data/10.txt
  25. 0 0
      test/data/100.txt
  26. 0 0
      test/data/1000.txt
  27. 0 0
      test/data/10000+.txt
  28. 0 0
      test/data/10000+route.txt
  29. 0 0
      test/data/10000.txt
  30. 0 0
      test/data/10000route.txt
  31. 0 0
      test/data/1000route.txt
  32. 0 0
      test/data/100route.txt
  33. 0 0
      test/data/2000.txt
  34. 0 0
      test/data/5000.txt
  35. 0 0
      test/data/7月1-24日移网质量投诉业务号码.txt
  36. 0 0
      test/data/8000.txt
  37. 0 0
      test/data/测试号码.txt
  38. 0 0
      test/data/测试号码1万多.txt
  39. 0 0
      test/data/测试号码2.txt

+ 1 - 1
.gitignore

@@ -183,4 +183,4 @@ local.properties
 *.iml
 out
 gen
-result
+test/result

+ 10 - 3
pom.xml

@@ -68,6 +68,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.13</version>
+        </dependency>
         <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
         <dependency>
             <groupId>com.squareup.okhttp3</groupId>
@@ -75,10 +80,12 @@
             <version>4.10.0</version>
             <scope>test</scope>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
         <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <version>1.13</version>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>31.1-jre</version>
+            <scope>test</scope>
         </dependency>
     </dependencies>
 

+ 47 - 25
src/main/java/com/nokia/domainb/capability/UsercomplaintQuerys.java

@@ -1,5 +1,9 @@
 package com.nokia.domainb.capability;
 
+import cn.chinaunicom.open.common.Const;
+import cn.chinaunicom.open.nlgxptconnection.COMPConnection;
+import cn.chinaunicom.open.nlgxptconnection.COMPConnectionContext;
+import cn.chinaunicom.open.nlgxptconnection.impl.COMPJsonConnection;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.client.RestTemplate;
 
@@ -11,12 +15,14 @@ import java.util.Map;
  * json_chinaUnicom_hb18_complaintManagement_usercomplaintQuerys
  */
 public class UsercomplaintQuerys extends AbstractQuery {
+    private static final String URL_DIRECT = "http://133.96.94.184:47996/ete/v1/rest/openApi/usercomplaintQuerys";
+    private static final String URL_TEST_DIRECT = "http://133.96.94.185:47996/ete/v1/rest/openApi/usercomplaintQuerys";
     private static final String url = "http://10.245.50.26:8000/api/chinaUnicom/hb18/complaintManagement/usercomplaintQuerys/v1";
     private static final String urlTest = "http://10.124.150.230:8000/api/chinaUnicom/hb18/complaintManagement/usercomplaintQuerys/v1";
 
-    public String query(String mobile, String destAddr, String complaintType, String isMobile,
+    public String queryDirect(String mobile, String destAddr, String complaintType, String isMobile,
             String flowNo, String beginTime, String endTime, String token, boolean test) {
-        String realUrl = test ? urlTest : url;
+        String realUrl = test ? URL_TEST_DIRECT : URL_DIRECT;
         // REQ
         Map<String, Object> req = new HashMap<>();
         req.put("mobile", mobile);
@@ -32,27 +38,43 @@ public class UsercomplaintQuerys extends AbstractQuery {
         return response.getBody();
     }
 
-//    public COMPConnectionContext query(String mobile, String destAddr, String complaintType, String isMobile,
-//                                       String flowNo, String beginTime, String endTime, String token, boolean test) {
-//        String realAppSecret = test ? appSecretTest : appSecret;
-//        String realUrl = test ? urlTest : url;
-//        COMPConnection compConnection = new COMPJsonConnection(appId, realAppSecret);
-//
-//        // REQ
-//        Map<String, Object> req = new HashMap<>();
-//
-//        Map<String, Object> userComplaintQuerysReq = new HashMap<>();
-//        req.put("USERCOMPLAINT_QUERYS_REQ", userComplaintQuerysReq);
-//
-//        userComplaintQuerysReq.put("mobile", mobile);
-//        userComplaintQuerysReq.put("destAddr", destAddr);
-//        userComplaintQuerysReq.put("complaintType", complaintType);
-//        userComplaintQuerysReq.put("isMobile", isMobile);
-//        userComplaintQuerysReq.put("flowNo", flowNo);
-//        userComplaintQuerysReq.put("beginTime", beginTime);
-//        userComplaintQuerysReq.put("endTime", endTime);
-//        userComplaintQuerysReq.put("token", token);
-//
-//        return compConnection.excute(Const.HttpMethodType.POST, realUrl, req, false);
-//    }
+    public String queryDirect(Map req, boolean test) {
+        String realUrl = test ? URL_TEST_DIRECT : URL_DIRECT;
+        RestTemplate restTemplate = new RestTemplate();
+        ResponseEntity<String> response = restTemplate.postForEntity(realUrl, req, String.class);
+        return response.getBody();
+    }
+
+    public COMPConnectionContext query(String mobile, String destAddr, String complaintType, String isMobile,
+                                       String flowNo, String beginTime, String endTime, String token, boolean test) {
+        String realAppSecret = test ? appSecretTest : appSecret;
+        String realUrl = test ? urlTest : url;
+        COMPConnection compConnection = new COMPJsonConnection(appId, realAppSecret);
+
+        // REQ
+        Map<String, Object> req = new HashMap<>();
+
+        Map<String, Object> userComplaintQuerysReq = new HashMap<>();
+        req.put("USERCOMPLAINT_QUERYS_REQ", userComplaintQuerysReq);
+
+        userComplaintQuerysReq.put("mobile", mobile);
+        userComplaintQuerysReq.put("destAddr", destAddr);
+        userComplaintQuerysReq.put("complaintType", complaintType);
+        userComplaintQuerysReq.put("isMobile", isMobile);
+        userComplaintQuerysReq.put("flowNo", flowNo);
+        userComplaintQuerysReq.put("beginTime", beginTime);
+        userComplaintQuerysReq.put("endTime", endTime);
+        userComplaintQuerysReq.put("token", token);
+
+        return compConnection.excute(Const.HttpMethodType.POST, realUrl, req, false);
+    }
+
+    public COMPConnectionContext query(Map map, boolean test) {
+        String realAppSecret = test ? appSecretTest : appSecret;
+        String realUrl = test ? urlTest : url;
+        COMPConnection compConnection = new COMPJsonConnection(appId, realAppSecret);
+        Map<String, Object> req = new HashMap<>();
+        req.put("USERCOMPLAINT_QUERYS_REQ", map);
+        return compConnection.excute(Const.HttpMethodType.POST, realUrl, req, false);
+    }
 }

+ 37 - 28
src/main/java/com/nokia/domainb/config/ControllerExceptionHandler.java

@@ -2,16 +2,18 @@ package com.nokia.domainb.config;
 
 import com.nokia.common.http.R;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.TypeMismatchException;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.http.converter.HttpMessageConversionException;
 import org.springframework.validation.BindException;
 import org.springframework.validation.FieldError;
-import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MissingRequestValueException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 
-import javax.validation.ConstraintViolationException;
+import javax.validation.ValidationException;
 
 /**
  * 请求异常处理
@@ -20,48 +22,55 @@ import javax.validation.ConstraintViolationException;
 @RestControllerAdvice
 public class ControllerExceptionHandler
 {
-    @ExceptionHandler(HttpMessageNotReadableException.class)
-    public ResponseEntity<Object> httpMessageNotReadableExceptionValidatorHandler(HttpMessageNotReadableException e)
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public ResponseEntity<Object> httpRequestMethodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException e)
     {
-        log.warn("╭( ′• o •′ )╭☞ 请求参数校验未通过: {}", e.getMessage());
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error().message(e.getMessage()));
+        log.warn(e.getMessage());
+        return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).body(R.error().message(e.getMessage()));
     }
 
-    @ExceptionHandler(BindException.class)
-    public ResponseEntity<Object> bindExceptionValidatorHandler(BindException e)
+    @ExceptionHandler(MissingRequestValueException.class)
+    public ResponseEntity<Object> missingRequestValueExceptionHandler(MissingRequestValueException e)
     {
-        FieldError fieldError = e.getBindingResult().getFieldError();
-        String message = "";
-        if (fieldError != null)
-        {
-            message = fieldError.getDefaultMessage();
-            log.warn("╭( ′• o •′ )╭☞ 请求参数校验未通过: {}", message);
-        }
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error().message(message));
+        log.warn(e.getMessage());
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(R.error().message(e.getMessage()));
     }
 
-    @ExceptionHandler(ConstraintViolationException.class)
-    public ResponseEntity<Object> constraintViolationExceptionValidatorHandler(ConstraintViolationException e)
+    @ExceptionHandler(HttpMessageConversionException.class)
+    public ResponseEntity<Object> httpMessageConversionExceptionHandler(HttpMessageConversionException e)
     {
-        String message = e.getConstraintViolations().iterator().next().getMessage();
-        log.warn("╭( ′• o •′ )╭☞ 请求参数校验未通过: {}", message);
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error().message(message));
+        log.warn(e.getMessage());
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(R.error().message(e.getMessage()));
     }
 
-    @ExceptionHandler(MethodArgumentNotValidException.class)
-    public ResponseEntity<Object> methodArgumentNotValidExceptionValidatorHandler(MethodArgumentNotValidException e)
+    @ExceptionHandler(TypeMismatchException.class)
+    public ResponseEntity<Object> typeMismatchExceptionHandler(TypeMismatchException e)
+    {
+        log.warn(e.getMessage());
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(R.error().message(e.getMessage()));
+    }
+
+    @ExceptionHandler(BindException.class)
+    public ResponseEntity<Object> bindExceptionHandler(BindException e)
     {
         FieldError fieldError = e.getBindingResult().getFieldError();
         String message = "";
         if (fieldError != null)
         {
             message = fieldError.getDefaultMessage();
-            log.warn("╭( ′• o •′ )╭☞ 请求参数校验未通过: {}", message);
         }
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error().message(message));
+        log.warn(message);
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(R.error().message(message));
     }
-    
-    @ExceptionHandler({Exception.class})
+
+    @ExceptionHandler(ValidationException.class)
+    public ResponseEntity<Object> validationExceptionHandler(ValidationException e)
+    {
+        log.warn(e.getMessage());
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(R.error().message(e.getMessage()));
+    }
+
+    @ExceptionHandler(Exception.class)
     public ResponseEntity<Object> exceptionHandler(Exception e)
     {
         log.error("╭( ′• o •′ )╭☞ 发生错误了 {}", e.getMessage(), e);

+ 13 - 36
src/main/java/com/nokia/domainb/config/LogAspectConfig.java

@@ -1,16 +1,13 @@
 package com.nokia.domainb.config;
 
-import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson2.JSON;
 import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.annotation.Pointcut;
 import org.slf4j.MDC;
 import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
 import org.springframework.util.StopWatch;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -32,11 +29,6 @@ import java.util.UUID;
 @Slf4j
 public class LogAspectConfig
 {
-    @Pointcut("execution(* com.nokia..ControllerExceptionHandler.*ValidatorHandler(..))")
-    public void validatorExceptionHandlerPointcut()
-    {
-        // Pointcut
-    }
 
     @Pointcut("execution(public * com.nokia..*Controller.*(..))")
     public void controllerPointcut()
@@ -50,31 +42,27 @@ public class LogAspectConfig
         // Pointcut
     }
 
-    @Pointcut("controllerPointcut() || validatorExceptionHandlerPointcut()")
-    public void beforePointCut()
-    {
-        // Pointcut
-    }
-
     @Pointcut("controllerPointcut() || controllerExceptionHandlerPointcut()")
-    public void afterPointCut()
+    public void aroundPointCut()
     {
         // Pointcut
     }
 
-    @Before("beforePointCut()")
-    public void doBefore(JoinPoint joinPoint)
+    @Around("aroundPointCut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable
     {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+        MDC.put("traceId", UUID.randomUUID().toString().replace("-", ""));
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        Object result = point.proceed();
         if (attributes == null)
         {
-            return;
+            return result;
         }
+
         HttpServletRequest request = attributes.getRequest();
-        // 打印请求信息
-        log.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
-        // 打印请求参数
-        Object[] args = joinPoint.getArgs();
+        Object[] args = point.getArgs();
         List<Object> list = new ArrayList<>();
         for (Object arg : args) {
             if (arg instanceof ServletRequest
@@ -86,20 +74,9 @@ public class LogAspectConfig
             }
             list.add(arg);
         }
-        if (CollectionUtils.isEmpty(list)) {
-            return;
-        }
-        log.info("请求参数: {}", JSON.toJSONString(list));
-    }
-
-    @Around("afterPointCut()")
-    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
-    {
-        StopWatch stopWatch = new StopWatch();
-        stopWatch.start();
-        MDC.put("traceId", UUID.randomUUID().toString().replace("-", ""));
-        Object result = proceedingJoinPoint.proceed();
         stopWatch.stop();
+        log.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
+        log.info("请求参数: {}", JSON.toJSONString(list));
         log.info("返回: {}", JSON.toJSONString(result));
         log.info("耗时:{} ms", stopWatch.getTotalTimeMillis());
         return result;

+ 26 - 0
src/main/java/com/nokia/domainb/config/ValidatorConfig.java

@@ -0,0 +1,26 @@
+package com.nokia.domainb.config;
+
+import org.hibernate.validator.HibernateValidator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+
+/**
+ * 校验配置
+ *
+ */
+@Configuration
+public class ValidatorConfig
+{
+    @Bean
+    public Validator validator()
+    {
+        try (ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()
+                .failFast(true).buildValidatorFactory()) {
+            return validatorFactory.getValidator();
+        }
+    }
+}

+ 4 - 4
src/main/java/com/nokia/domainb/service/DomainService.java

@@ -1,10 +1,7 @@
 package com.nokia.domainb.service;
 
 import cn.chinaunicom.open.nlgxptconnection.COMPConnectionContext;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
+import com.google.gson.*;
 import com.nokia.common.http.R;
 import com.nokia.domainb.capability.*;
 import com.nokia.domainb.dto.*;
@@ -26,6 +23,7 @@ public class DomainService {
     public R route(RouteDTO dto) {
         QryRouteAll qryRouteAll = new QryRouteAll();
         String result = qryRouteAll.query(dto.getPhoneNumber());
+        log.info("路由查询响应: {}", result);
         JsonObject jsonObject = JsonParser.parseString(result).getAsJsonObject();
         JsonObject rsp = jsonObject.getAsJsonObject("UNI_BSS_BODY")
                 .getAsJsonObject("QRYROUTEALL_RSP")
@@ -238,6 +236,7 @@ public class DomainService {
             // 欠费查询
             QryOweFee qryOweFee = new QryOweFee();
             String result = qryOweFee.query(dto.getPhoneNumber(), province);
+            log.info("欠费查询响应: {}", result);
             JsonObject jsonObject = JsonParser.parseString(result).getAsJsonObject();
             JsonObject rsp = jsonObject.getAsJsonObject("UNI_BSS_BODY")
                     .getAsJsonObject("QRY_OWE_FEE_RSP")
@@ -286,6 +285,7 @@ public class DomainService {
         return CompletableFuture.supplyAsync(() -> {
             GetEcredit getEcredit = new GetEcredit();
             String result = getEcredit.query(dto.getPhoneNumber());
+            log.info("用户信用度查询响应: {}", result);
             JsonObject jsonObject = JsonParser.parseString(result).getAsJsonObject();
             JsonObject rsp = jsonObject.getAsJsonObject("UNI_BSS_BODY")
                     .getAsJsonObject("GET_ECREDIT_RSP")

+ 21 - 0
src/main/java/com/nokia/domainb/util/AESUtil.java

@@ -4,12 +4,25 @@ import org.apache.commons.codec.binary.Base64;
 
 import javax.crypto.Cipher;
 import javax.crypto.spec.SecretKeySpec;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
 /**
  *
  * @author Administrator
  *
  */
 public class AESUtil {
+    public static final String C_KEY = "qg4uY8nV7fPhvUXt";
+
+    public static String getToken(String username) throws Exception {
+        String cSrc = getCurrentTimeString() + "_" + username;
+        return Encrypt(cSrc, C_KEY);
+    }
+
+    public static String Encrypt(String sSrc) throws Exception {
+        return Encrypt(sSrc, C_KEY);
+    }
 
     // 加密
     public static String Encrypt(String sSrc, String sKey) throws Exception {
@@ -63,6 +76,14 @@ public class AESUtil {
         }
     }
 
+    public static String getCurrentTimeString() {
+        return getTimeString(LocalDateTime.now());
+    }
+
+    public static String getTimeString(LocalDateTime time) {
+        return time.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+    }
+
     public static void main(String[] args) throws Exception {
         /*
          * 此处使用AES-128-ECB加密模式,key需要为16位。

+ 0 - 10
src/main/resources/data/10.txt

@@ -1,10 +0,0 @@
-18503369666,18,0335
-18632450346,18,0314
-15633553235,18,0311
-18632157917,18,0311
-16603112238,18,0311
-15557153750,36,0571
-13206786656,97,0469
-18331524020,18,0315
-13131680581,18,0316
-18603271888,18,0311

+ 1 - 1
src/test/java/com/nokia/domainb/capability/BlacklistApiRemoveTest.java

@@ -8,7 +8,7 @@ public class BlacklistApiRemoveTest {
     @Test
     void testQuery() {
         BlacklistApiRemove blacklistApiRemove = new BlacklistApiRemove();
-        COMPConnectionContext result = blacklistApiRemove.query("13231899751", true);
+        COMPConnectionContext result = blacklistApiRemove.query("13231899751", false);
         System.out.println(result.getResponseContext());
     }
 }

+ 19 - 20
src/test/java/com/nokia/domainb/capability/ForeignproductTest.java

@@ -5,19 +5,17 @@ import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
-import com.nokia.domainb.util.Utils;
 import de.siegmar.fastcsv.writer.CsvWriter;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
+import java.util.stream.Stream;
 
 /**
  * 已订购产品查询
@@ -28,7 +26,8 @@ class ForeignproductTest {
     @Test
     void test() {
         Foreignproduct foreignproduct = new Foreignproduct();
-        COMPConnectionContext result = foreignproduct.query("18633367653", "18", false);
+        COMPConnectionContext result = foreignproduct.query("03123028023", "18", false);
+        System.out.println();
         System.out.println(result.getResponseContext());
     }
 
@@ -41,11 +40,12 @@ class ForeignproductTest {
             e.printStackTrace();
             return;
         }
-        Set<String> phones = Utils.readPhones();
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), StandardCharsets.UTF_8);
-             CsvWriter csv = CsvWriter.builder().build(osw);) {
+        String dataPath = "test/data/10000route.txt";
+        try (Stream<String> lines = Files.lines(Paths.get(dataPath));
+             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "gbk");
+             CsvWriter csv = CsvWriter.builder().build(osw)) {
             csv.writeRow("phone", "productType", "productName");
-            for (String t : phones) {
+            lines.distinct().forEach(t -> {
                 Map<String, JsonObject> map = new HashMap<>();
                 String[] a = t.split(",");
                 String phone = a[0];
@@ -58,20 +58,19 @@ class ForeignproductTest {
                         .getAsJsonObject("FOREIGN_PRODUCT_RSP")
                         .getAsJsonObject("RSP");
                 String rspCode = rsp.get("RSP_CODE").getAsString();
-                if (!"0000".equals(rspCode)) {
-                    continue;
-                }
-                JsonArray data = rsp.getAsJsonArray("DATA");
-                for (JsonElement tt : data) {
-                    JsonObject ttt = tt.getAsJsonObject();
-                    if ("M".equals(ttt.get("productType").getAsString())) {
-                        map.put(phone + ttt.get("productType").getAsString() + ttt.get("productName").getAsString(), ttt);
+                if ("0000".equals(rspCode)) {
+                    JsonArray data = rsp.getAsJsonArray("DATA");
+                    for (JsonElement tt : data) {
+                        JsonObject ttt = tt.getAsJsonObject();
+                        if ("M".equals(ttt.get("productType").getAsString())) {
+                            map.put(phone + ttt.get("productType").getAsString() + ttt.get("productName").getAsString(), ttt);
+                        }
+                    }
+                    for (JsonObject value : map.values()) {
+                        csv.writeRow(phone, value.get("productType").getAsString(), value.get("productName").getAsString());
                     }
                 }
-                for (JsonObject value : map.values()) {
-                    csv.writeRow(phone, value.get("productType").getAsString(), value.get("productName").getAsString());
-                }
-            }
+            });
         } catch (IOException e) {
             e.printStackTrace();
         }

+ 6 - 7
src/test/java/com/nokia/domainb/capability/GetEcreditTest.java

@@ -2,7 +2,6 @@ package com.nokia.domainb.capability;
 
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
-import com.nokia.domainb.util.Utils;
 import de.siegmar.fastcsv.writer.CsvWriter;
 import org.junit.jupiter.api.Test;
 
@@ -11,7 +10,7 @@ import java.io.OutputStreamWriter;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.time.LocalDateTime;
-import java.util.Set;
+import java.util.stream.Stream;
 
 class GetEcreditTest {
     @Test
@@ -45,13 +44,13 @@ class GetEcreditTest {
     @Test
     void test() {
         GetEcredit getEcredit = new GetEcredit();
-        Set<String> phones = Utils.readPhones();
-//        String filePath = "result/用户信用度查询样本.csv";
+        String dataPath = "test/data/10000.txt";
         String filePath = "result/用户信用度查询.csv";
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
-             CsvWriter csv = CsvWriter.builder().build(osw);) {
+        try (Stream<String> lines = Files.lines(Paths.get(dataPath));
+             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
+             CsvWriter csv = CsvWriter.builder().build(osw)) {
             csv.writeRow("手机号", "时间", "调用时长", "结果");
-            phones.forEach(t -> {
+            lines.distinct().forEach(t -> {
                 String[] a = t.split(",");
                 String phone = a[0];
                 LocalDateTime startTime = LocalDateTime.now();

+ 5 - 6
src/test/java/com/nokia/domainb/capability/PkgValueTest.java

@@ -1,7 +1,6 @@
 package com.nokia.domainb.capability;
 
 import cn.chinaunicom.open.nlgxptconnection.COMPConnectionContext;
-import com.nokia.domainb.util.Utils;
 import de.siegmar.fastcsv.writer.CsvWriter;
 import org.junit.jupiter.api.Test;
 
@@ -10,19 +9,19 @@ import java.io.OutputStreamWriter;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.time.LocalDateTime;
-import java.util.Set;
+import java.util.stream.Stream;
 
 public class PkgValueTest {
     @Test
     void testQuery() {
         PkgValue pkgValue = new PkgValue();
-        Set<String> phones = Utils.readPhones();
-//        String filePath = "result/查询用户套餐值样本.csv";
         String filePath = "result/查询用户套餐值.csv";
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
+        String dataPath = "test/data/10000route.txt";
+        try (Stream<String> lines = Files.lines(Paths.get(dataPath));
+             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
              CsvWriter csv = CsvWriter.builder().build(osw);) {
             csv.writeRow("手机号", "时间", "调用时长", "结果");
-            phones.forEach(t -> {
+            lines.distinct().forEach(t -> {
                 String[] a = t.split(",");
                 String phone = a[0];
                 String provinceCode = a[1];

+ 5 - 5
src/test/java/com/nokia/domainb/capability/QryOweFeeTest.java

@@ -2,7 +2,6 @@ package com.nokia.domainb.capability;
 
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
-import com.nokia.domainb.util.Utils;
 import de.siegmar.fastcsv.writer.CsvWriter;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
@@ -12,7 +11,7 @@ import java.io.OutputStreamWriter;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.time.LocalDateTime;
-import java.util.Set;
+import java.util.stream.Stream;
 
 @Slf4j
 class QryOweFeeTest {
@@ -47,12 +46,13 @@ class QryOweFeeTest {
     @Test
     void test() {
         QryOweFee qryOweFee = new QryOweFee();
-        Set<String> phones = Utils.readPhones();
         String filePath = "result/欠费查询接口1000条数据测试结果.csv";
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
+        String dataPath = "test/data/10000route.txt";
+        try (Stream<String> lines = Files.lines(Paths.get(dataPath));
+             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
              CsvWriter csv = CsvWriter.builder().build(osw);) {
             csv.writeRow("手机号", "时间", "调用时长", "结果");
-            phones.forEach(t -> {
+            lines.distinct().forEach(t -> {
                 String[] a = t.split(",");
                 String phone = a[0];
                 String provinceCode = a[1];

+ 51 - 2
src/test/java/com/nokia/domainb/capability/QryRouteAllTest.java

@@ -6,7 +6,10 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.nokia.domainb.capability.entity.Route;
 import com.nokia.domainb.util.Utils;
+import de.siegmar.fastcsv.reader.CsvReader;
+import de.siegmar.fastcsv.reader.CsvRow;
 import de.siegmar.fastcsv.writer.CsvWriter;
+import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 import org.springframework.util.StringUtils;
 
@@ -14,12 +17,16 @@ import java.io.BufferedWriter;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.time.LocalDateTime;
 import java.util.Set;
 
-public class QryRouteAllTest {
+@Slf4j
+class QryRouteAllTest {
+    public static final String TEST_DIR = "test/";
+
     @Test
     void testQuery() {
         QryRouteAll qryRouteAll = new QryRouteAll();
@@ -91,7 +98,7 @@ public class QryRouteAllTest {
     @Test
     void testQuery2() {
         QryRouteAll qryRouteAll = new QryRouteAll();
-        Route result = qryRouteAll.query2("13231899751", false);
+        Route result = qryRouteAll.query2("03103169155", false);
         System.out.println(result);
     }
 
@@ -101,4 +108,46 @@ public class QryRouteAllTest {
         Route result = qryRouteAll.query2("13739798862", false);
         System.out.println(result);
     }
+
+    @Test
+    void testGetCode() {
+        String d1 = TEST_DIR + "data.csv";
+        String result1 = TEST_DIR + "result.csv";
+        try (CsvReader r1 = CsvReader.builder().build(Paths.get(d1), StandardCharsets.UTF_8);
+             OutputStreamWriter osw1 = new OutputStreamWriter(Files.newOutputStream(Paths.get(result1)),
+                     "GBK");
+             CsvWriter w1 = CsvWriter.builder().build(osw1)) {
+            w1.writeRow("phone", "PROVINCE_CODE", "EPARCHY_CODE");
+            for (CsvRow row : r1) {
+                String phone = row.getField(0);
+                String provinceCode = "";
+                String eparchyCode = "";
+                String result;
+                try {
+                    QryRouteAll qryRouteAll = new QryRouteAll();
+                    result = qryRouteAll.query(phone);
+                    log.info("{} {} {}", row.getOriginalLineNumber(), phone, result);
+                    JsonObject jsonObject = JsonParser.parseString(result).getAsJsonObject();
+                    JsonObject rsp = jsonObject.getAsJsonObject("UNI_BSS_BODY")
+                            .getAsJsonObject("QRYROUTEALL_RSP")
+                            .getAsJsonObject("RSP");
+                    JsonObject data = rsp.getAsJsonArray("DATA").get(0).getAsJsonObject();
+                    JsonElement provinceCodeElement = data.get("PROVINCE_CODE");
+                    if (provinceCodeElement != null) {
+                        provinceCode = data.get("PROVINCE_CODE").getAsString();
+                    }
+
+                    JsonElement eparchyCodeElement = data.get("EPARCHY_CODE");
+                    if (eparchyCodeElement != null) {
+                        eparchyCode = eparchyCodeElement.getAsString();
+                    }
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+                w1.writeRow(phone, provinceCode, eparchyCode);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 0 - 20
src/test/java/com/nokia/domainb/capability/QryUserIsUdmTest.java

@@ -9,25 +9,5 @@ public class QryUserIsUdmTest {
         QryUserIsUdm qryUserIsUdm = new QryUserIsUdm();
         COMPConnectionContext result = qryUserIsUdm.query("15631768706", "18", false);
         System.out.println(result.getResponseContext());
-//        Set<String> phones = Utils.readPhones();
-////        String filePath = "result/微服务_用户中心_5G用户查询样本.csv";
-//        String filePath = "result/微服务_用户中心_5G用户查询.csv";
-//        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
-//             CsvWriter csv = CsvWriter.builder().build(osw);) {
-//            csv.writeRow("手机号", "时间", "调用时长", "结果");
-//            phones.forEach(t -> {
-//                String[] a = t.split(",");
-//                String phone = a[0];
-//                String provinceCode = a[1];
-//                LocalDateTime startTime = LocalDateTime.now();
-//                long startTimestamp = System.currentTimeMillis();
-//                COMPConnectionContext result = qryUserIsUdm.query(phone, provinceCode, false);
-//                long endTimestamp = System.currentTimeMillis();
-//                long cost = endTimestamp - startTimestamp;
-//                csv.writeRow(phone, startTime.toString(), String.valueOf(cost), result.getResponseContext());
-//            });
-//        } catch (IOException e) {
-//            e.printStackTrace();
-//        }
     }
 }

+ 2 - 40
src/test/java/com/nokia/domainb/capability/QryUserProdMsgTest.java

@@ -1,51 +1,13 @@
 package com.nokia.domainb.capability;
 
 import cn.chinaunicom.open.nlgxptconnection.COMPConnectionContext;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.nokia.domainb.util.Utils;
-import de.siegmar.fastcsv.writer.CsvWriter;
 import org.junit.jupiter.api.Test;
 
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.time.LocalDateTime;
-import java.util.Set;
-
 public class QryUserProdMsgTest {
     @Test
     void testQuery() {
         QryUserProdMsg qryUserProdMsg = new QryUserProdMsg();
-//        COMPConnectionContext result = qryUserProdMsg.query("18503369666", "18", "0335", false);
-//        System.out.println(result.getResponseContext());
-        Set<String> phones = Utils.readPhones();
-//        String filePath = "result/查询用户产品信息样本.csv";
-        String filePath = "result/查询用户产品信息.csv";
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
-             CsvWriter csv = CsvWriter.builder().build(osw);) {
-            csv.writeRow("手机号", "时间", "调用时长", "结果");
-            phones.forEach(t -> {
-                String[] a = t.split(",");
-                String phone = a[0];
-                String provinceCode = a[1];
-                String eparchyCode = a[2];
-                LocalDateTime startTime = LocalDateTime.now();
-                long startTimestamp = System.currentTimeMillis();
-                COMPConnectionContext result = qryUserProdMsg.query(phone, provinceCode, eparchyCode, false);
-                long endTimestamp = System.currentTimeMillis();
-                long cost = endTimestamp - startTimestamp;
-                JsonObject jsonObject = JsonParser.parseString(result.getResponseContext()).getAsJsonObject();
-                JsonArray data = jsonObject.getAsJsonObject("UNI_BSS_BODY")
-                        .getAsJsonObject("QRYUSERPRODMSG_RSP")
-                        .getAsJsonObject("RSP")
-                        .getAsJsonArray("DATA");
-                csv.writeRow(phone, startTime.toString(), String.valueOf(cost), data.toString());
-            });
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
+        COMPConnectionContext result = qryUserProdMsg.query("18503369666", "18", "0335", false);
+        System.out.println(result.getResponseContext());
     }
 }

+ 1 - 1
src/test/java/com/nokia/domainb/capability/SmsBlacklistQueryTest.java

@@ -8,7 +8,7 @@ public class SmsBlacklistQueryTest {
     @Test
     void testQuery() {
         SmsBlacklistQuery smsBlacklistQuery = new SmsBlacklistQuery();
-        COMPConnectionContext result = smsBlacklistQuery.query("13231899751", "test", true);
+        COMPConnectionContext result = smsBlacklistQuery.query("13231899751", "test", false);
         System.out.println(result.getRequestContext());
         System.out.println(result.getResponseContext());
     }

+ 12 - 13
src/test/java/com/nokia/domainb/capability/SpThreePartCheckTest.java

@@ -1,7 +1,6 @@
 package com.nokia.domainb.capability;
 
 import cn.chinaunicom.open.nlgxptconnection.COMPConnectionContext;
-import com.nokia.domainb.util.Utils;
 import de.siegmar.fastcsv.writer.CsvWriter;
 import org.junit.jupiter.api.Test;
 
@@ -10,19 +9,26 @@ import java.io.OutputStreamWriter;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.time.LocalDateTime;
-import java.util.Set;
+import java.util.stream.Stream;
 
 public class SpThreePartCheckTest {
     @Test
     void testQuery() {
         SpThreePartCheck spThreePartCheck = new SpThreePartCheck();
-        Set<String> phones = Utils.readPhones();
-//        String filePath = "result/用户资料三户返回样本.csv";
+        COMPConnectionContext result = spThreePartCheck.query("18631229993", "18", false);
+        System.out.println(result.getResponseContext());
+    }
+
+    @Test
+    void test() {
+        SpThreePartCheck spThreePartCheck = new SpThreePartCheck();
+        String dataPath = "test/data/10000route.txt";
         String filePath = "result/用户资料三户返回.csv";
-        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
+        try (Stream<String> lines = Files.lines(Paths.get(dataPath));
+             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)), "GBK");
              CsvWriter csv = CsvWriter.builder().build(osw);) {
             csv.writeRow("手机号", "时间", "调用时长", "结果");
-            phones.forEach(t -> {
+            lines.distinct().forEach(t -> {
                 String[] a = t.split(",");
                 String phone = a[0];
                 String provinceCode = a[1];
@@ -37,11 +43,4 @@ public class SpThreePartCheckTest {
             e.printStackTrace();
         }
     }
-
-    @Test
-    void test() {
-        SpThreePartCheck spThreePartCheck = new SpThreePartCheck();
-        COMPConnectionContext result = spThreePartCheck.query("18631229993", "18", false);
-        System.out.println(result.getResponseContext());
-    }
 }

+ 98 - 128
src/test/java/com/nokia/domainb/capability/UsercomplaintQuerysTest.java

@@ -1,6 +1,8 @@
 package com.nokia.domainb.capability;
 
 import com.alibaba.fastjson2.JSON;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.nokia.domainb.util.AESUtil;
 import de.siegmar.fastcsv.reader.CsvReader;
 import de.siegmar.fastcsv.reader.CsvRow;
@@ -14,148 +16,43 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @Slf4j
 class UsercomplaintQuerysTest {
-    public static final String TEST_DIR = "z:/";
-
-    @Test
-    void test() {
-        String d1 = TEST_DIR + "103.csv";
-        String d2 = TEST_DIR + "101.csv";
-        String result1 = TEST_DIR + "无法发送测试结果.csv";
-        String result2 = TEST_DIR + "无法接收测试结果.csv";
-        try (CsvReader r1 = CsvReader.builder().build(Paths.get(d1), StandardCharsets.UTF_8);
-             CsvReader r2 = CsvReader.builder().build(Paths.get(d2), StandardCharsets.UTF_8);
-             OutputStreamWriter osw1 = new OutputStreamWriter(Files.newOutputStream(Paths.get(result1)),
-                        StandardCharsets.UTF_8);
-             CsvWriter w1 = CsvWriter.builder().build(osw1);
-             OutputStreamWriter osw2 = new OutputStreamWriter(Files.newOutputStream(Paths.get(result2)),
-                        StandardCharsets.UTF_8);
-             CsvWriter w2 = CsvWriter.builder().build(osw2);) {
-            w1.writeRow("入参", "时间", "调用时长", "结果");
-            for (CsvRow row : r1) {
-                if (row.getOriginalLineNumber() == 1) {
-                    continue;
-                }
-
-                String mobile = row.getField(1);
-                LocalDateTime beginTimeLocalDateTime = getLocalDateTime(row.getField(2));
-                String beginTime = getTimeString(beginTimeLocalDateTime);
-                // String endTime = "";
-                String endTime = getTimeString(beginTimeLocalDateTime.plusDays(3));
-                String cKey = "qg4uY8nV7fPhvUXt";
-                String cSrc = getTimeString() + "_" + "test";
-                String token = AESUtil.Encrypt(cSrc, cKey);
-                String complaintType = "1";
-                String isMobile = "";
-                String flowNo = "103";
-                String destAddr = "";
-                Map<String, Object> map = new HashMap<>();
-                map.put("mobile", mobile);
-                map.put("destAddr", destAddr);
-                map.put("complaintType", complaintType);
-                map.put("isMobile", isMobile);
-                map.put("flowNo", flowNo);
-                map.put("beginTime", beginTime);
-                map.put("endTime", endTime);
-                map.put("token", token);
-                UsercomplaintQuerys usercomplaintQuerys = new UsercomplaintQuerys();
-                String result;
-                String now = LocalDateTime.now().toString();
-                StopWatch stopWatch = new StopWatch();
-                stopWatch.start();
-                try {
-                    result = usercomplaintQuerys.query(mobile, destAddr, complaintType, isMobile, flowNo, beginTime,
-                            endTime, token, false);
-                } catch (Exception e) {
-                    result = e.getMessage();
-                }
-                stopWatch.stop();
-                log.info("{} | {} ms | {}", mobile, stopWatch.getTotalTimeMillis(), result);
-                w1.writeRow(JSON.toJSONString(map), now, String.valueOf(stopWatch.getTotalTimeMillis()),
-                        JSON.toJSONString(result));
-            }
-
-            w2.writeRow("入参", "时间", "调用时长", "结果");
-            for (CsvRow row : r2) {
-                if (row.getOriginalLineNumber() == 1) {
-                    continue;
-                }
-
-                String mobile = row.getField(1);
-                LocalDateTime beginTimeLocalDateTime = getLocalDateTime(row.getField(2));
-                String beginTime = getTimeString(beginTimeLocalDateTime);
-                // String endTime = "";
-                String endTime = getTimeString(beginTimeLocalDateTime.plusDays(3));
-                String cKey = "qg4uY8nV7fPhvUXt";
-                String cSrc = getTimeString() + "_" + "test";
-                String token = AESUtil.Encrypt(cSrc, cKey);
-                String complaintType = "2";
-                String isMobile = "";
-                String flowNo = "101";
-                String destAddr = "";
-                Map<String, Object> map = new HashMap<>();
-                map.put("mobile", mobile);
-                map.put("destAddr", destAddr);
-                map.put("complaintType", complaintType);
-                map.put("isMobile", isMobile);
-                map.put("flowNo", flowNo);
-                map.put("beginTime", beginTime);
-                map.put("endTime", endTime);
-                map.put("token", token);
-                UsercomplaintQuerys usercomplaintQuerys = new UsercomplaintQuerys();
-                String result;
-                String now = LocalDateTime.now().toString();
-                StopWatch stopWatch = new StopWatch();
-                stopWatch.start();
-                try {
-                    result = usercomplaintQuerys.query(mobile, destAddr, complaintType, isMobile, flowNo, beginTime,
-                            endTime, token, false);
-                } catch (Exception e) {
-                    result = e.getMessage();
-                }
-                stopWatch.stop();
-                log.info("{} | {} ms | {}", mobile, stopWatch.getTotalTimeMillis(), result);
-                w2.writeRow(JSON.toJSONString(map), now, String.valueOf(stopWatch.getTotalTimeMillis()),
-                        JSON.toJSONString(result));
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
+    public static final String TEST_DIR = "test/";
 
     // 单例测试
     @Test
     void testQuery() throws Exception {
-        // 统一使用,不需要修改
-        String cKey = "qg4uY8nV7fPhvUXt";
-//        String cSrc = getTimeString() + "_" + "n1test004";
-        String cSrc = getTimeString() + "_" + "test";
-        String token = AESUtil.Encrypt(cSrc, cKey);
+//        String username = "n1test004";
+        String username = "test";
+        String token = AESUtil.getToken(username);
         // 单例测试时修改参数
-        String mobile = "15690352051";
+        String mobile = "15369158994";
         String destAddr = "";
         // 所有接收101 指定接收102 所有发送 103 指定发送104
         String flowNo = "103";
 //        String flowNo = "103";
-        String beginTime = "20221015000000";
-        String endTime = "20221018000000";
+//        String beginTime = "20221029001228";
+//        String endTime = "20221105001228";
+        LocalDateTime endTimeLocalDateTime = LocalDateTime.now();
+        String endTime = AESUtil.getTimeString(endTimeLocalDateTime);
+        String beginTime = AESUtil.getTimeString(endTimeLocalDateTime.minusDays(7));
 //        String complaintType = "2";
         String complaintType = "1";
         // 可以统一传空
         String isMobile = "";
-
         UsercomplaintQuerys usercomplaintQuerys = new UsercomplaintQuerys();
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
-        String result = usercomplaintQuerys.query(mobile, destAddr, complaintType, isMobile, flowNo, beginTime,
+        String result = usercomplaintQuerys.queryDirect(mobile, destAddr, complaintType, isMobile, flowNo, beginTime,
                 endTime, token, false);
 //        COMPConnectionContext result = usercomplaintQuerys.query(mobile, destAddr, complaintType, isMobile, flowNo,
-//                beginTime, endTime, token, true);
+//                beginTime, endTime, token, false);
         stopWatch.stop();
         Map<String, String> req = new HashMap<>();
         req.put("mobile", mobile);
@@ -172,20 +69,93 @@ class UsercomplaintQuerysTest {
 //        Object res = JSON.parse(result.getResponseContext());
         map.put("res", res);
         log.info("入参:{}", JSON.toJSONString(req));
-        log.info("{} ms | 结果:{}", stopWatch.getTotalTimeMillis(), result);
+        log.info("{} ms | 结果:{}", stopWatch.getTotalTimeMillis(), res);
 //        log.info("{} ms | 结果:{}", stopWatch.getTotalTimeMillis(), result.getResponseContext());
         log.info("map: {}", JSON.toJSONString(map));
     }
 
-    private String getTimeString(LocalDateTime time) {
-        return time.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
-    }
-
-    private String getTimeString() {
-        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+    /**
+     * 提取ete_complaint_query_log_tab的query_param
+     */
+    @Test
+    void testGetQueryParam() {
+        String dataPath = TEST_DIR + "ete_complaint_query_log_tab.csv";
+        String resultPath = TEST_DIR + "data.csv";
+        try (CsvReader reader = CsvReader.builder().build(Paths.get(dataPath), StandardCharsets.UTF_8);
+             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(resultPath)),
+                     StandardCharsets.UTF_8);
+             CsvWriter writer = CsvWriter.builder().build(osw);
+        ) {
+            Map<String, List<String>> map = new HashMap<>();
+            for (CsvRow row : reader) {
+                if (row.getOriginalLineNumber() == 1) {
+                    continue;
+                }
+                String queryParam = row.getField(3);
+                JsonObject jsonObject = JsonParser.parseString(queryParam).getAsJsonObject();
+                String mobile = jsonObject.get("mobile").getAsString();
+                String flowNo = jsonObject.get("flowNo").getAsString();
+                String complaintType = jsonObject.get("complaintType").getAsString();
+                List<String> list = new ArrayList<>();
+                list.add(mobile);
+                list.add(flowNo);
+                list.add(complaintType);
+                map.putIfAbsent(mobile, list);
+            }
+            for (List<String> value : map.values()) {
+                writer.writeRow(value);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
     }
 
-    private LocalDateTime getLocalDateTime(String time) {
-        return LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+    @Test
+    void testRepeat() {
+        // 数据文件路径
+        String dataPath = TEST_DIR + "data.csv";
+        String resultPath = TEST_DIR + "result.csv";
+        try (CsvReader reader = CsvReader.builder().build(Paths.get(dataPath), StandardCharsets.UTF_8);
+             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(resultPath)),
+                     "gbk");
+             CsvWriter writer = CsvWriter.builder().build(osw)) {
+            writer.writeRow("号码", "时间", "耗时(s)", "耗时(ms)", "入参", "结果");
+            List<Map> list = new ArrayList<>();
+            for (CsvRow row : reader) {
+                Map map = JSON.parseObject(row.getField(3), Map.class);
+                log.info("map: {}", JSON.toJSONString(map));
+                list.add(map);
+            }
+            for (int i = 0; i < 10; i++) {
+                log.info("{}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", i);
+                for (Map req : list) {
+//                    String username = "test";
+//                    String token = AESUtil.getToken(username);
+//                    req.put("token", token);
+                    String res;
+                    UsercomplaintQuerys usercomplaintQuerys = new UsercomplaintQuerys();
+                    LocalDateTime now = LocalDateTime.now();
+                    StopWatch stopWatch = new StopWatch();
+                    stopWatch.start();
+                    try {
+                        res = usercomplaintQuerys.queryDirect(req, false);
+                    } catch (Exception e) {
+                        log.error(e.getMessage(), e);
+                        res = e.getMessage();
+                    }
+                    stopWatch.stop();
+                    List<String> data = new ArrayList<>();
+                    data.add(req.get("mobile").toString());
+                    data.add(now.toString());
+                    data.add(String.valueOf((long) Math.ceil(stopWatch.getTotalTimeSeconds())));
+                    data.add(String.valueOf(stopWatch.getTotalTimeMillis()));
+                    data.add(JSON.toJSONString(req));
+                    data.add(res);
+                    writer.writeRow(data);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
     }
 }

+ 57 - 0
src/test/java/com/nokia/domainb/capability/config/TestConfig.java

@@ -0,0 +1,57 @@
+package com.nokia.domainb.capability.config;
+
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.ConnectionPool;
+import okhttp3.OkHttpClient;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
+import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@TestConfiguration
+public class TestConfig {
+    public static final int qps = 2;
+    public static final int corePoolSize = 100;
+    public static final int maximumPoolSize = corePoolSize;
+    public static LinkedBlockingQueue<List<String>> queue = new LinkedBlockingQueue<>();
+
+    @Bean
+    public RestTemplate template() {
+        return new RestTemplate(new OkHttp3ClientHttpRequestFactory(new OkHttpClient().newBuilder()
+                .connectionPool(new ConnectionPool(1000, 10, TimeUnit.MINUTES)).build()));
+    }
+
+    @Bean
+    public ThreadPoolExecutor requestExecutor() {
+        ThreadPoolExecutor t = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
+                0L, TimeUnit.MILLISECONDS,
+                new LinkedBlockingQueue<>(), new CustomizableThreadFactory("request-"));
+        t.prestartAllCoreThreads();
+        return t;
+    }
+
+    @Bean
+    public ThreadPoolExecutor offerExecutor() {
+        ThreadPoolExecutor t = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
+                0L, TimeUnit.MILLISECONDS,
+                new LinkedBlockingQueue<>(), new CustomizableThreadFactory("offer-"));
+        t.prestartAllCoreThreads();
+        return t;
+    }
+
+    @Bean
+    public ThreadPoolTaskScheduler scheduler() {
+        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
+        scheduler.setThreadNamePrefix("scheduler-");
+        scheduler.initialize();
+        return scheduler;
+    }
+}

+ 150 - 202
src/test/java/com/nokia/domainb/capability/controller/DomainControllerTest.java

@@ -1,135 +1,100 @@
 package com.nokia.domainb.capability.controller;
 
 import com.alibaba.fastjson2.JSON;
-import com.nokia.common.http.R;
-import com.nokia.domainb.dto.*;
-import com.nokia.domainb.util.Utils;
-import de.siegmar.fastcsv.reader.CsvReader;
-import de.siegmar.fastcsv.reader.CsvRow;
+import com.google.common.collect.Lists;
+import com.nokia.domainb.capability.config.TestConfig;
+import com.nokia.domainb.dto.RouteDTO;
 import de.siegmar.fastcsv.writer.CsvWriter;
-import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.ConnectionPool;
-import okhttp3.OkHttpClient;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Import;
-import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
-import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.util.StopWatch;
 import org.springframework.web.client.RestTemplate;
 
 import java.io.IOException;
 import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.time.Instant;
 import java.time.LocalDateTime;
-import java.util.Set;
-import java.util.concurrent.LinkedBlockingQueue;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Slf4j
 @SpringBootTest
-@Import(DomainControllerTest.ConcurrentTestConfig.class)
+@Import(TestConfig.class)
 class DomainControllerTest {
-    public static final int poolSize = 40;
     /**
      * 测试结果保存文件夹
      */
-    public static final String TEST_DIR = "z:/";
+    public static final String TEST_DIR = "test/";
+    /**
+     * 数据文件路径
+     */
+    public static final String DATA_PATH = TEST_DIR + "data/10000.txt";
+    
     @Autowired
     private RestTemplate template;
     @Autowired
-    private ThreadPoolExecutor executor;
-
-    @TestConfiguration
-    static class ConcurrentTestConfig {
-        @Bean
-        public RestTemplate template() {
-            return new RestTemplate(new OkHttp3ClientHttpRequestFactory(new OkHttpClient().newBuilder()
-                    .connectionPool(new ConnectionPool(1000, 10, TimeUnit.MINUTES))
-                    .build()));
-        }
-
-        @Bean
-        public ThreadPoolExecutor executor() {
-            ThreadPoolExecutor executor = new ThreadPoolExecutor(poolSize, poolSize, 0L, TimeUnit.MILLISECONDS,
-                    new LinkedBlockingQueue<>(), new CustomizableThreadFactory("test-"));
-            executor.prestartAllCoreThreads();
-            return executor;
-        }
-    }
+    private ThreadPoolExecutor requestExecutor;
+    @Autowired
+    private ThreadPoolExecutor offerExecutor;
+    @Autowired
+    private ThreadPoolTaskScheduler scheduler;
 
     /**
-     * 欠费接口整合并发测试
+     * 路由查询并发测试
      */
     @Test
-    void testQryOweFee() {
-        // 每个请求结果保存的路径
-        String singlePath = TEST_DIR + "qryowefee/single/";
-        // 合并结果保存的路径
-        String resultPath = TEST_DIR + "qryowefee/";
+    void testRoute() {
+        // 测试环境地址
+        String url = "http://192.168.50.3:12091/domainB/api/route/";
+        // 正式环境地址
+//        String url = "http://192.168.70.130:12091/domainB/api/route/";
+        // 结果保存的路径
+        String resultPath = TEST_DIR + "result/route/";
         // 创建文件夹
         try {
-            Files.createDirectories(Paths.get(singlePath));
             Files.createDirectories(Paths.get(resultPath));
         } catch (IOException e) {
-            e.printStackTrace();
+            log.error("创建文件夹失败: {}", e.getMessage(), e);
             return;
         }
-        resultPath = resultPath + "欠费接口整合" + poolSize + "个线程8000条数据测试结果.csv";
-        // 接口地址
-        String url = "http://192.168.50.3:12091/domainB/api/acting/qryowefee/";
-        Set<String> phones = Utils.readPhones();
-        for (String t : phones) {
-            QryowefeeDTO dto = new QryowefeeDTO("test", t);
-            executor.submit(new Task(template, t, url, dto, singlePath));
-        }
-
-        // 等待所有任务执行结束
-        while (executor.getActiveCount() > 0) {
-        }
-        mergeResult(phones, resultPath, singlePath);
+        resultPath = resultPath + "路由查询" + TestConfig.qps + "个线程10000条数据测试结果.csv";
+        request(url);
+        writeFile(resultPath);
     }
 
     /**
-     * 路由查询并发测试
+     * 欠费接口整合并发测试
      */
     @Test
-    void testRoute() {
-        // 每个请求结果保存的路径
-        String singlePath = TEST_DIR + "route/single/";
-        // 合并结果保存的路径
-        String resultPath = TEST_DIR + "route/";
+    void testQryOweFee() {
+        // 测试环境地址
+        String url = "http://192.168.50.3:12091/domainB/api/acting/qryowefee/";
+        // 正式环境地址
+//        String url = "http://192.168.70.130:12091/domainB/api/acting/qryowefee/";
+        // 结果保存的路径
+        String resultPath = TEST_DIR + "qryowefee/";
+        resultPath = resultPath + "欠费接口整合" + TestConfig.qps + "个线程10000条数据测试结果.csv";
         // 创建文件夹
         try {
-            Files.createDirectories(Paths.get(singlePath));
             Files.createDirectories(Paths.get(resultPath));
         } catch (IOException e) {
-            e.printStackTrace();
+            log.error("创建文件夹失败: {}", e.getMessage(), e);
             return;
         }
-        resultPath = resultPath + "路由查询" + poolSize + "个线程10000条数据测试结果.csv";
-//        resultPath = resultPath + "路由查询" + poolSize + "个线程1000条数据测试结果.csv";
-//        resultPath = resultPath + "路由查询" + poolSize + "个线程100条数据测试结果.csv";
-        // 接口地址
-        String url = "http://133.96.94.108:12091/domainB/api/route/";
-        Set<String> phones = Utils.readPhones();
-        for (String t : phones) {
-            String[] a = t.split(",");
-            String phoneNumber = a[0];
-            RouteDTO dto = new RouteDTO("test", phoneNumber);
-            executor.submit(new Task(template, phoneNumber, url, dto, singlePath));
-        }
-        // 等待所有任务执行结束
-        while (executor.getActiveCount() > 0) {
-        }
-        mergeResult(phones, resultPath, singlePath);
+        resultPath = resultPath + "欠费接口整合" + TestConfig.qps + "个线程100条数据测试结果.csv";
+        request(url);
+        writeFile(resultPath);
     }
 
     /**
@@ -137,34 +102,22 @@ class DomainControllerTest {
      */
     @Test
     void testSa() {
-        // 每个请求结果保存的路径
-        String singlePath = TEST_DIR + "sa/single/";
-        // 合并结果保存的路径
+        // 测试环境地址
+        String url = "http://192.168.50.3:12091/domainB/api/sa/";
+        // 正式环境地址
+//        String url = "http://192.168.70.130:12091/domainB/api/sa/";
+        // 结果保存的路径
         String resultPath = TEST_DIR + "sa/";
         // 创建文件夹
         try {
-            Files.createDirectories(Paths.get(singlePath));
             Files.createDirectories(Paths.get(resultPath));
         } catch (IOException e) {
             e.printStackTrace();
             return;
         }
-        resultPath = resultPath + "5GSA查询" + poolSize + "个线程10000条数据测试结果.csv";
-//        resultPath = resultPath + "5GSA查询" + poolSize + "个线程1000条数据测试结果.csv";
-//        resultPath = resultPath + "5GSA查询" + poolSize + "个线程100条数据测试结果.csv";
-        // 接口地址
-        String url = "http://133.96.94.108:12091/domainB/api/sa/";
-        Set<String> phones = Utils.readPhones();
-        for (String t : phones) {
-            String[] a = t.split(",");
-            String phoneNumber = a[0];
-            SaDTO dto = new SaDTO("test", phoneNumber);
-            executor.submit(new Task(template, phoneNumber, url, dto, singlePath));
-        }
-        // 等待所有任务执行结束
-        while (executor.getActiveCount() > 0) {
-        }
-        mergeResult(phones, resultPath, singlePath);
+        resultPath = resultPath + "5GSA查询" + TestConfig.qps + "个线程10000条数据测试结果.csv";
+        request(url);
+        writeFile(resultPath);
     }
 
     /**
@@ -172,33 +125,22 @@ class DomainControllerTest {
      */
     @Test
     void testSaAndVolte() {
-        // 每个请求结果保存的路径
-        String singlePath = TEST_DIR + "saAndVolte/single/";
+        // 测试环境地址
+        String url = "http://192.168.50.3:12091/domainB/api/product/saAndVolte/";
+        // 正式环境地址
+//        String url = "http://192.168.70.130:12091/domainB/api/product/saAndVolte/";
         // 合并结果保存的路径
         String resultPath = TEST_DIR + "saAndVolte/";
         // 创建文件夹
         try {
-            Files.createDirectories(Paths.get(singlePath));
             Files.createDirectories(Paths.get(resultPath));
         } catch (IOException e) {
             e.printStackTrace();
             return;
         }
-        resultPath = resultPath + "new功能查询" + poolSize + "个线程10000条数据测试结果.csv";
-//        resultPath = resultPath + "功能查询" + poolSize + "个线程1000条数据测试结果.csv";
-//        resultPath = resultPath + "功能查询" + poolSize + "个线程100条数据测试结果.csv";
-        // 接口地址
-        String url = "http://192.168.50.3:12091/domainB/api/product/saAndVolte/";
-//        String url = "http://133.96.94.108:12091/domainB/api/product/saAndVolte/";
-        Set<String> phones = Utils.readPhones();
-        for (String t : phones) {
-            SaAndVolteDTO dto = new SaAndVolteDTO("test", t);
-            executor.submit(new Task(template, t, url, dto, singlePath));
-        }
-        // 等待所有任务执行结束
-        while (executor.getActiveCount() > 0) {
-        }
-        mergeResult(phones, resultPath, singlePath);
+        resultPath = resultPath + "功能查询" + TestConfig.qps + "个线程10000条数据测试结果.csv";
+        request(url);
+        writeFile(resultPath);
     }
 
     /**
@@ -206,104 +148,110 @@ class DomainControllerTest {
      */
     @Test
     void testUserState() {
-        // 每个请求结果保存的路径
-        String singlePath = TEST_DIR + "userState/single/";
+        // 测试环境地址
+        String url = "http://192.168.50.3:12091/domainB/api/threePart/userState/";
+        // 正式环境地址
+//        String url = "http://192.168.70.130:12091/domainB/api/threePart/userState/";
         // 合并结果保存的路径
         String resultPath = TEST_DIR + "userState/";
         // 创建文件夹
         try {
-            Files.createDirectories(Paths.get(singlePath));
             Files.createDirectories(Paths.get(resultPath));
         } catch (IOException e) {
             e.printStackTrace();
             return;
         }
-        resultPath = resultPath + "用户资料三户返回" + poolSize + "个线程7月1-24日移网质量投诉业务号码测试结果.csv";
-        // 接口地址
-        String url = "http://133.96.94.108:12091/domainB/api/threePart/userState/";
-        Set<String> phones = Utils.readPhones();
-        for (String t : phones) {
-            String[] a = t.split(",");
-            String phoneNumber = a[0];
-            UserStateDTO dto = new UserStateDTO("test", phoneNumber);
-            executor.submit(new Task(template, phoneNumber, url, dto, singlePath));
-        }
-        // 等待所有任务执行结束
-        while (executor.getActiveCount() > 0) {
-        }
-        mergeResult(phones, resultPath, singlePath);
+        resultPath = resultPath + "用户资料三户返回" + TestConfig.qps + "个线程10000条数据测试结果.csv";
+        request(url);
+        writeFile(resultPath);
     }
 
     /**
-     * 合并结果
-     *
-     * @param phones     手机列表
-     * @param resultPath 合并结果保存路径
-     * @param singlePath 单个结果保存路径
+     * 并发请求
+     * @param url 接口地址
      */
-    private void mergeResult(Set<String> phones, String resultPath, String singlePath) {
-        try(OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(resultPath)),
-                StandardCharsets.UTF_8);
-            CsvWriter csvWriter = CsvWriter.builder().build(osw);
-            ) {
-            csvWriter.writeRow("入参", "时间", "调用时长", "结果");
-            for (String phone : phones) {
-//                phone = phone.split(",")[0];
-                Path path = Paths.get(singlePath + phone + ".csv");
-                try (CsvReader csvReader = CsvReader.builder().build(path, StandardCharsets.UTF_8)) {
-                    for (CsvRow row : csvReader) {
-                        csvWriter.writeRow(row.getField(0), row.getField(1), row.getField(2),
-                                row.getField(3));
-                    }
-                } catch (IOException e) {
-                    log.error("{} -> {}", phone, e.getMessage(), e);
-                }
+    private void request(String url) {
+        try(Stream<String> lines = Files.lines(Paths.get(DATA_PATH))) {
+            // 去重
+            List<String> list = lines.distinct().collect(Collectors.toList());
+            // 切分数据,每秒 qps 个请求
+            List<List<String>> parts = Lists.partition(list, TestConfig.qps);
+            // 任务执行时间
+            Instant startTime = Instant.now();
+            for (List<String> p : parts) {
+                startTime = startTime.plusSeconds(1);
+                // 添加定时任务
+                scheduler.schedule(() -> {
+                    // 并发请求
+                    CompletableFuture.allOf(p.stream().map(t ->
+                            CompletableFuture.runAsync(() -> {
+                                RouteDTO dto = new RouteDTO("test", t);
+                                Object r;
+                                LocalDateTime now = LocalDateTime.now();
+                                StopWatch stopWatch = new StopWatch();
+                                stopWatch.start();
+                                try {
+                                    r = template.postForObject(url, dto, Object.class);
+                                } catch (Exception e) {
+                                    log.error(e.getMessage(), e);
+                                    r = e.getMessage();
+                                }
+                                stopWatch.stop();
+                                List<String> data = new ArrayList<>();
+                                data.add(now.toString());
+                                data.add(String.valueOf((long) Math.ceil(stopWatch.getTotalTimeSeconds())));
+                                data.add(String.valueOf(stopWatch.getTotalTimeMillis()));
+                                data.add(JSON.toJSONString(dto));
+                                data.add(JSON.toJSONString(r));
+                                // 结果入队列
+                                CompletableFuture.runAsync(() -> TestConfig.queue.offer(data), offerExecutor);
+                            }, requestExecutor)).toArray(CompletableFuture[]::new));
+                }, startTime);
             }
-        } catch (IOException e) {
-            e.printStackTrace();
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
         }
     }
 
-    @AllArgsConstructor
-    class Task implements Runnable {
-        private RestTemplate restTemplate;
-        private String phoneNumber;
-        private String url;
-        private Object dto;
-        private String singlePath;
-
-        @Override
-        public void run() {
-            String filePath = singlePath + phoneNumber + ".csv";
-            LocalDateTime startTime = LocalDateTime.now();
-            long startTimestamp = System.currentTimeMillis();
-            R r;
-            try {
-                r = restTemplate.postForObject(url, dto, R.class);
-            } catch (Exception e) {
-                long endTimestamp = System.currentTimeMillis();
-                long cost = endTimestamp - startTimestamp;
-                log.error("{} cost {} -> {}", phoneNumber, cost, e.getMessage(), e);
-                try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)),
-                        StandardCharsets.UTF_8);
-                     CsvWriter csv = CsvWriter.builder().build(osw);) {
-                    csv.writeRow(JSON.toJSONString(dto), startTime.toString(), String.valueOf(cost),
-                            JSON.toJSONString(e.getMessage()));
-                    return;
-                } catch (IOException ioException) {
-                    log.error("{} cost {} -> {}", phoneNumber, cost, ioException.getMessage(), ioException);
-                    return;
-                }
-            }
-            long endTimestamp = System.currentTimeMillis();
-            long cost = endTimestamp - startTimestamp;
-            try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(filePath)),
-                    StandardCharsets.UTF_8);
-                 CsvWriter csv = CsvWriter.builder().build(osw);) {
-                csv.writeRow(JSON.toJSONString(dto), startTime.toString(), String.valueOf(cost), JSON.toJSONString(r));
-            } catch (IOException e) {
-                log.error("{} cost {} -> {}", phoneNumber, cost, e.getMessage(), e);
+    /**
+     * 写文件
+     *
+     * @param path 写入文件路径
+     */
+    public void writeFile(String path) {
+        ScheduledThreadPoolExecutor scheduledExecutor = scheduler.getScheduledThreadPoolExecutor();
+        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(path)),
+                "gbk");
+             CsvWriter csv = CsvWriter.builder().build(osw)) {
+            csv.writeRow("时间", "耗时(s)", "耗时(ms)", "入参", "结果");
+            while (scheduler.getActiveCount() > 0
+                    || !scheduledExecutor.getQueue().isEmpty()
+                    || scheduledExecutor.getCompletedTaskCount() < scheduledExecutor.getTaskCount()
+                    || requestExecutor.getActiveCount() > 0
+                    || !requestExecutor.getQueue().isEmpty()
+                    || requestExecutor.getCompletedTaskCount() < requestExecutor.getTaskCount()
+                    || offerExecutor.getActiveCount() > 0
+                    || !offerExecutor.getQueue().isEmpty()
+                    || offerExecutor.getCompletedTaskCount() < offerExecutor.getTaskCount()
+                    || !TestConfig.queue.isEmpty()) {
+                List<String> t = TestConfig.queue.take();
+                csv.writeRow(t);
+                log.info("schedulerCompletedTaskCount: {}, schedulerTaskCount: {}, schedulerQueueSize: {}, schedulerActiveCount: {}, requestCompletedTaskCount: {}, requestTaskCount: {}, requestQueueSize: {}, requestActiveCount: {}, offerCompletedTaskCount: {}, offerTaskCount: {}, offerExecutorQueueSize: {}, OfferActiveCount: {}",
+                        scheduledExecutor.getCompletedTaskCount(),
+                        scheduledExecutor.getTaskCount(),
+                        scheduledExecutor.getQueue().size(),
+                        scheduler.getActiveCount(),
+                        requestExecutor.getCompletedTaskCount(),
+                        requestExecutor.getTaskCount(),
+                        requestExecutor.getQueue().size(),
+                        requestExecutor.getActiveCount(),
+                        offerExecutor.getCompletedTaskCount(),
+                        offerExecutor.getTaskCount(),
+                        offerExecutor.getQueue().size(),
+                        offerExecutor.getActiveCount());
             }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
         }
     }
 }

+ 267 - 0
src/test/java/com/nokia/domainb/capability/sdk/SdkConcurrentTest.java

@@ -0,0 +1,267 @@
+package com.nokia.domainb.capability.sdk;
+
+import cn.chinaunicom.open.nlgxptconnection.COMPConnectionContext;
+import com.alibaba.fastjson2.JSON;
+import com.google.common.collect.Lists;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.nokia.domainb.capability.QryRouteAll;
+import com.nokia.domainb.capability.UsercomplaintQuerys;
+import com.nokia.domainb.capability.config.TestConfig;
+import com.nokia.domainb.util.AESUtil;
+import de.siegmar.fastcsv.reader.CsvReader;
+import de.siegmar.fastcsv.reader.CsvRow;
+import de.siegmar.fastcsv.writer.CsvWriter;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Import;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.util.StopWatch;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+@SpringBootTest
+@Import(TestConfig.class)
+class SdkConcurrentTest {
+    /**
+     * 测试文件夹
+     */
+    public static final String TEST_DIR = "test/";
+
+    @Autowired
+    private ThreadPoolExecutor requestExecutor;
+    @Autowired
+    private ThreadPoolExecutor offerExecutor;
+    @Autowired
+    private ThreadPoolTaskScheduler scheduler;
+
+    @Test
+    void testQryRouteAll() {
+        // 数据文件路径
+        String dataPath = TEST_DIR + "data.csv";
+        // 结果保存的文件路径
+        String resultPath = TEST_DIR + "result.csv";
+        try(Stream<String> lines = Files.lines(Paths.get(dataPath))) {
+            // 去重
+            List<String> list = lines.distinct().collect(Collectors.toList());
+            // 切分数据,每秒 qps 个请求
+            List<List<String>> parts = Lists.partition(list, TestConfig.qps);
+            // 任务执行时间
+            Instant startTime = Instant.now();
+            QryRouteAll qryRouteAll = new QryRouteAll();
+            for (List<String> p : parts) {
+                startTime = startTime.plusSeconds(1);
+                // 添加定时任务
+                scheduler.schedule(() -> {
+                    // 并发请求
+                    CompletableFuture.allOf(p.stream().map(t ->
+                            CompletableFuture.runAsync(() -> {
+                                String provinceCode = "";
+                                String eparchyCode = "";
+                                String result;
+                                LocalDateTime now = LocalDateTime.now();
+                                StopWatch stopWatch = new StopWatch();
+                                stopWatch.start();
+                                try {
+                                    result = qryRouteAll.query(t);
+                                    JsonObject jsonObject = JsonParser.parseString(result).getAsJsonObject();
+                                    JsonObject rsp = jsonObject.getAsJsonObject("UNI_BSS_BODY")
+                                            .getAsJsonObject("QRYROUTEALL_RSP")
+                                            .getAsJsonObject("RSP");
+                                    JsonObject data = rsp.getAsJsonArray("DATA").get(0).getAsJsonObject();
+                                    JsonElement provinceCodeElement = data.get("PROVINCE_CODE");
+                                    if (provinceCodeElement != null) {
+                                        provinceCode = data.get("PROVINCE_CODE").getAsString();
+                                    }
+
+                                    JsonElement eparchyCodeElement = data.get("EPARCHY_CODE");
+                                    if (eparchyCodeElement != null) {
+                                        eparchyCode = eparchyCodeElement.getAsString();
+                                    }
+                                } catch (Exception e) {
+                                    log.error(e.getMessage(), e);
+                                    result = e.getMessage();
+                                }
+                                stopWatch.stop();
+                                List<String> data = new ArrayList<>();
+                                data.add(t);
+                                data.add(provinceCode);
+                                data.add(eparchyCode);
+                                data.add(now.toString());
+                                data.add(String.valueOf((long) Math.ceil(stopWatch.getTotalTimeSeconds())));
+                                data.add(String.valueOf(stopWatch.getTotalTimeMillis()));
+                                data.add(result);
+                                // 结果入队列
+                                CompletableFuture.runAsync(() -> TestConfig.queue.offer(data), offerExecutor);
+                            }, requestExecutor)).toArray(CompletableFuture[]::new));
+                }, startTime);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        writeFile(resultPath);
+    }
+
+    @Test
+    void testUserComplaintQuery() {
+        // 结果保存的文件夹路径
+        String resultDirPath = TEST_DIR + "result/userComplaintQuery/";
+        // 创建文件夹
+        try {
+            Files.createDirectories(Paths.get(resultDirPath));
+        } catch (IOException e) {
+            log.error("创建文件夹失败: {}", e.getMessage(), e);
+            return;
+        }
+        // 查询时间范围
+        long day = 5;
+        // 结果保存文件
+        String resultPath = resultDirPath + "短信用户投诉分析查询接口" + day + "天范围" + TestConfig.qps + "个线程1000条数据测试结果.csv";
+        userComplaintQuery(day, resultPath);
+//        day = 6;
+//        resultPath = resultDirPath + "短信用户投诉分析查询接口" + day + "天范围" + TestConfig.qps + "个线程1000条数据测试结果.csv";
+//        userComplaintQuery(day, resultPath);
+//        day = 7;
+//        resultPath = resultDirPath + "短信用户投诉分析查询接口" + day + "天范围" + TestConfig.qps + "个线程1000条数据测试结果.csv";
+//        userComplaintQuery(day, resultPath);
+    }
+
+    public void userComplaintQuery(long day, String resultPath) {
+        // 数据文件路径
+        String dataPath = TEST_DIR + "data.csv";
+        String username = "test";
+        String token;
+        try {
+            token = AESUtil.getToken(username);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return;
+        }
+        String destAddr = "";
+        // 可以统一传空
+        String isMobile = "";
+        LocalDateTime endTimeLocalDateTime = LocalDateTime.now();
+        String endTime = AESUtil.getTimeString(endTimeLocalDateTime);
+        String beginTime = AESUtil.getTimeString(endTimeLocalDateTime.minusDays(day));
+        List<Map<String, String>> list = new ArrayList<>();
+        try (CsvReader reader = CsvReader.builder().build(Paths.get(dataPath), StandardCharsets.UTF_8)) {
+            for (CsvRow row : reader) {
+                String mobile = row.getField(0);
+                // 所有接收101 指定接收102 所有发送 103 指定发送104
+                String flowNo = row.getField(1);
+                String complaintType = row.getField(2);
+                Map<String, String> reqMap = new HashMap<>();
+                reqMap.put("mobile", mobile);
+                reqMap.put("destAddr", destAddr);
+                reqMap.put("complaintType", complaintType);
+                reqMap.put("isMobile", isMobile);
+                reqMap.put("flowNo", flowNo);
+                reqMap.put("beginTime", beginTime);
+                reqMap.put("endTime", endTime);
+                reqMap.put("token", token);
+                list.add(reqMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return;
+        }
+        UsercomplaintQuerys usercomplaintQuerys = new UsercomplaintQuerys();
+        // 切分数据,每秒 qps 个请求
+        List<List<Map<String, String>>> parts = Lists.partition(list, TestConfig.qps);
+        // 任务执行时间
+        Instant startTime = Instant.now();
+        for (List<Map<String, String>> p : parts) {
+            startTime = startTime.plusSeconds(1);
+            // 添加定时任务
+            scheduler.schedule(() -> {
+                // 并发请求
+                CompletableFuture.allOf(p.stream().map(t ->
+                        CompletableFuture.runAsync(() -> {
+                            Object res;
+                            LocalDateTime now = LocalDateTime.now();
+                            StopWatch stopWatch = new StopWatch();
+                            stopWatch.start();
+                            try {
+                                COMPConnectionContext r = usercomplaintQuerys.query(t, false);
+                                res = r.getResponseContext();
+                            } catch (Exception e) {
+                                log.error(e.getMessage(), e);
+                                res = e.getMessage();
+                            }
+                            stopWatch.stop();
+                            List<String> data = new ArrayList<>();
+                            data.add(now.toString());
+                            data.add(String.valueOf((long) Math.ceil(stopWatch.getTotalTimeSeconds())));
+                            data.add(String.valueOf(stopWatch.getTotalTimeMillis()));
+                            data.add(JSON.toJSONString(t));
+                            data.add(JSON.toJSONString(res));
+                            // 结果入队列
+                            CompletableFuture.runAsync(() -> TestConfig.queue.offer(data), offerExecutor);
+                        }, requestExecutor)).toArray(CompletableFuture[]::new));
+            }, startTime);
+        }
+        writeFile(resultPath);
+    }
+
+    /**
+     * 写文件
+     *
+     * @param path 写入文件路径
+     */
+    public void writeFile(String path) {
+        ScheduledThreadPoolExecutor scheduledExecutor = scheduler.getScheduledThreadPoolExecutor();
+        try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(path)),
+                "gbk");
+             CsvWriter csv = CsvWriter.builder().build(osw)) {
+//            csv.writeRow("时间", "耗时(s)", "耗时(ms)", "入参", "结果");
+            csv.writeRow("phone","provinceCode","eparchyCode","时间", "耗时(s)", "耗时(ms)", "结果");
+            while (scheduler.getActiveCount() > 0
+                    || !scheduledExecutor.getQueue().isEmpty()
+                    || scheduledExecutor.getCompletedTaskCount() < scheduledExecutor.getTaskCount()
+                    || requestExecutor.getActiveCount() > 0
+                    || !requestExecutor.getQueue().isEmpty()
+                    || requestExecutor.getCompletedTaskCount() < requestExecutor.getTaskCount()
+                    || offerExecutor.getActiveCount() > 0
+                    || !offerExecutor.getQueue().isEmpty()
+                    || offerExecutor.getCompletedTaskCount() < offerExecutor.getTaskCount()
+                    || !TestConfig.queue.isEmpty()) {
+                List<String> t = TestConfig.queue.take();
+                csv.writeRow(t);
+                log.info("schedulerCompletedTaskCount: {}, schedulerTaskCount: {}, schedulerQueueSize: {}, schedulerActiveCount: {}, requestCompletedTaskCount: {}, requestTaskCount: {}, requestQueueSize: {}, requestActiveCount: {}, offerCompletedTaskCount: {}, offerTaskCount: {}, offerExecutorQueueSize: {}, OfferActiveCount: {}",
+                        scheduledExecutor.getCompletedTaskCount(),
+                        scheduledExecutor.getTaskCount(),
+                        scheduledExecutor.getQueue().size(),
+                        scheduler.getActiveCount(),
+                        requestExecutor.getCompletedTaskCount(),
+                        requestExecutor.getTaskCount(),
+                        requestExecutor.getQueue().size(),
+                        requestExecutor.getActiveCount(),
+                        offerExecutor.getCompletedTaskCount(),
+                        offerExecutor.getTaskCount(),
+                        offerExecutor.getQueue().size(),
+                        offerExecutor.getActiveCount());
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+}

+ 10 - 0
test/data/10.txt

@@ -0,0 +1,10 @@
+18503369666
+18632450346
+15633553235
+18632157917
+16603112238
+15557153750
+13206786656
+18331524020
+13131680581
+18603271888

+ 0 - 0
src/main/resources/data/100.txt → test/data/100.txt


+ 0 - 0
src/main/resources/data/1000.txt → test/data/1000.txt


+ 0 - 0
src/main/resources/data/10000+.txt → test/data/10000+.txt


+ 0 - 0
src/main/resources/data/10000+route.txt → test/data/10000+route.txt


+ 0 - 0
src/main/resources/data/10000.txt → test/data/10000.txt


+ 0 - 0
src/main/resources/data/10000route.txt → test/data/10000route.txt


+ 0 - 0
src/main/resources/data/1000route.txt → test/data/1000route.txt


+ 0 - 0
src/main/resources/data/100route.txt → test/data/100route.txt


+ 0 - 0
src/main/resources/data/2000.txt → test/data/2000.txt


+ 0 - 0
src/main/resources/data/5000.txt → test/data/5000.txt


+ 0 - 0
src/main/resources/data/7月1-24日移网质量投诉业务号码.txt → test/data/7月1-24日移网质量投诉业务号码.txt


+ 0 - 0
src/main/resources/data/8000.txt → test/data/8000.txt


+ 0 - 0
src/main/resources/data/测试号码.txt → test/data/测试号码.txt


+ 0 - 0
src/main/resources/data/测试号码1万多.txt → test/data/测试号码1万多.txt


+ 0 - 0
src/main/resources/data/测试号码2.txt → test/data/测试号码2.txt