Commit 88e47805 authored by 黎博's avatar 黎博

合并master

parents b02c68ed 715dfe0b
......@@ -29,3 +29,6 @@ build/
### VS Code ###
.vscode/
### local log ###
*.log
......@@ -116,10 +116,40 @@
</dependency>
<!-- log4j -->
<!-- <dependency>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- <artifactId>log4j-1.2-api</artifactId>-->
<!-- <version>2.11.1</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.11.1</version>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>cn.quantgroup</groupId>
<artifactId>spring-boot-starter-sentry</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>cn.quantgroup</groupId>
<artifactId>spring-boot-starter-sentry</artifactId>
<version>1.0.9</version>
</dependency>
<!-- fastjson -->
......@@ -171,6 +201,12 @@
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.offbytwo.jenkins</groupId>
<artifactId>jenkins-client</artifactId>
<version>0.3.8</version>
</dependency>
</dependencies>
<build>
......
package cn.qg.qaplatform.common.aspect;
package cn.qg.qaplatform.aspect;
import cn.qg.qaplatform.utils.JsonTransUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.apache.commons.io.IOUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
......@@ -17,8 +18,11 @@ import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
......@@ -45,11 +49,12 @@ public class HttpLogAspect {
public void doBefore(JoinPoint joinPoint) throws JsonProcessingException {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("url:{}", request.getRequestURL());
logger.info("method:{}", request.getMethod());
logger.info("ip:{}", request.getRemoteAddr());
logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("args:{}", joinPoint.getArgs());
// logger.info("url:{}", request.getRequestURL());
// logger.info("method:{}", request.getMethod());
// logger.info("ip:{}", request.getRemoteAddr());
// logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
// logger.info("args:{}", joinPoint.getArgs());
logger.info("请求发起ip地址: {}, 请求url: {}, 请求参数:{}", request.getRemoteAddr(), request.getRequestURI(), getQuery(request));
}
/**
......@@ -97,4 +102,38 @@ public class HttpLogAspect {
return argList;
}
}
private String getQuery(HttpServletRequest request) {
if (isPostPutRequest(request)) {
return getParameters(request) + getRequestBody(request);
} else {
return getParameters(request);
}
}
private boolean isPostPutRequest(HttpServletRequest request) {
return "POST".equalsIgnoreCase(request.getMethod()) || "PUT".equalsIgnoreCase(request.getMethod());
}
private String getParameters(HttpServletRequest request) {
StringBuilder sb = new StringBuilder();
Map<String, String[]> params = request.getParameterMap();
for (String key : params.keySet()) {
sb.append('[')
.append(key)
.append('=')
.append(request.getParameter(key))
.append("] ");
}
return sb.toString();
}
private String getRequestBody(HttpServletRequest request) {
try {
return IOUtils.toString(request.getInputStream(), String.valueOf(Charset.defaultCharset()));
} catch (IOException e) {
return "";
}
}
}
\ No newline at end of file
......@@ -2,8 +2,8 @@ package cn.qg.qaplatform.automation.controller;
import cn.qg.qaplatform.automation.domain.Interface;
import cn.qg.qaplatform.automation.service.InterfaceService;
import cn.qg.qaplatform.common.JsonResult;
import cn.qg.qaplatform.common.SwitchDataSource;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.utils.JsonResult;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -20,8 +20,8 @@ public class InterfaceController {
@GetMapping("/list")
public JsonResult getInterfaceList(Integer projectId, Integer moduleId,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
IPage<Interface> page = interfaceService.getInterfaceList(projectId, moduleId, pageNum, pageSize);
Map<String, Object> map = new HashMap<>();
map.put("list", page.getRecords());
......
......@@ -2,9 +2,8 @@ package cn.qg.qaplatform.automation.controller;
import cn.qg.qaplatform.automation.domain.Module;
import cn.qg.qaplatform.automation.service.ModuleService;
import cn.qg.qaplatform.common.JsonResult;
import cn.qg.qaplatform.common.SwitchDataSource;
import com.sun.org.apache.xpath.internal.operations.Mod;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -16,7 +15,7 @@ public class ModuleController {
ModuleService moduleService;
@GetMapping("/list")
public JsonResult getModuleList() {
public JsonResult getModuleList() {
SwitchDataSource.dataSourceSwitch("localhost", "automation");
return JsonResult.success(moduleService.list());
}
......
......@@ -2,8 +2,8 @@ package cn.qg.qaplatform.automation.controller;
import cn.qg.qaplatform.automation.domain.Project;
import cn.qg.qaplatform.automation.service.ProjectService;
import cn.qg.qaplatform.common.JsonResult;
import cn.qg.qaplatform.common.SwitchDataSource;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......
......@@ -3,17 +3,14 @@ package cn.qg.qaplatform.automation.controller;
import cn.qg.qaplatform.automation.domain.Testcase;
import cn.qg.qaplatform.automation.service.AssertService;
import cn.qg.qaplatform.automation.service.TestcaseService;
import cn.qg.qaplatform.common.JsonResult;
import cn.qg.qaplatform.common.SwitchDataSource;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.utils.JsonResult;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@CrossOrigin
......@@ -57,7 +54,7 @@ public class TestcaseController {
public JsonResult executeTestcase(Integer testcaseId) throws Exception {
SwitchDataSource.dataSourceSwitch("localhost", "automation");
Map<String, Object> resultMap = new HashMap<>();
JSONObject response = testcaseService.exexuteTestcase(testcaseId);
JSONObject response = testcaseService.exexuteTestcase(testcaseId);
Boolean assertResult = assertService.assertResponse(testcaseId, response);
resultMap.put("response", response);
resultMap.put("assertResult", assertResult);
......
......@@ -3,8 +3,7 @@ package cn.qg.qaplatform.automation.service.impl;
import cn.qg.qaplatform.automation.domain.Interface;
import cn.qg.qaplatform.automation.mapper.InterfaceMapper;
import cn.qg.qaplatform.automation.service.InterfaceService;
import cn.qg.qaplatform.common.SwitchDataSource;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import cn.qg.qaplatform.config.SwitchDataSource;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
......
......@@ -5,7 +5,7 @@ import cn.qg.qaplatform.automation.domain.Project;
import cn.qg.qaplatform.automation.domain.Testcase;
import cn.qg.qaplatform.automation.mapper.*;
import cn.qg.qaplatform.automation.service.TestcaseService;
import cn.qg.qaplatform.common.SwitchDataSource;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.utils.HttpClientUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
......
......@@ -6,9 +6,6 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Mybatis-plus分页配置
*/
@Configuration
@MapperScan("cn.qg.qaplatform.*.mapper*")
public class MybatisPlusConfig {
......@@ -16,6 +13,11 @@ public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
......
......@@ -23,7 +23,7 @@ public class Swagger2Config {
.groupName("测试平台后台")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("cn.qg.qaplatform.controller"))
.apis(RequestHandlerSelectors.basePackage("cn.qg.qaplatform.zdata.controller"))
.paths(PathSelectors.any())
.build()
.securitySchemes(securitySchemes())
......
package cn.qg.qaplatform.common;
package cn.qg.qaplatform.config;
import cn.qg.qaplatform.common.enums.Namespace;
import cn.qg.qaplatform.config.DynamicDataSource;
import cn.qg.qaplatform.enums.Namespace;
import com.alibaba.druid.pool.DruidDataSource;
......@@ -15,6 +14,20 @@ public class SwitchDataSource {
public static void dataSourceSwitch(String namespace, String database) {
/**
* dev1环境
*/
if (namespace.equals("dev1")) {
DruidDataSource druidDataSource = new DruidDataSource();
String url = Namespace.DEV1.getUrl() + database + SUFFIX;
String dbKey = Namespace.DEV1.getKey();
druidDataSource.setUrl(url);
druidDataSource.setUsername(Namespace.DEV1.getUsername());
druidDataSource.setPassword(Namespace.DEV1.getPassword());
DynamicDataSource.dataSourcesMap.put(dbKey, druidDataSource);
DynamicDataSource.setDataSource(dbKey);
}
/**
* pre 环境
*/
......@@ -168,16 +181,5 @@ public class SwitchDataSource {
DynamicDataSource.dataSourcesMap.put(dbKey, druidDataSource);
DynamicDataSource.setDataSource(dbKey);
}
if (namespace.equals("localhost")) {
DruidDataSource druidDataSource = new DruidDataSource();
String url = Namespace.LOCALHOST.getUrl() + database + SUFFIX;
String dbKey = Namespace.LOCALHOST.getKey();
druidDataSource.setUrl(url);
druidDataSource.setUsername(Namespace.LOCALHOST.getUsername());
druidDataSource.setPassword(Namespace.LOCALHOST.getPassword());
DynamicDataSource.dataSourcesMap.put(dbKey, druidDataSource);
DynamicDataSource.setDataSource(dbKey);
}
}
}
package cn.qg.qaplatform.common.enums;
package cn.qg.qaplatform.enums;
/**
* 定义错误类别
......
package cn.qg.qaplatform.common.enums;
package cn.qg.qaplatform.enums;
public enum Namespace {
PRE("pre","pre", "jdbc:mysql://172.17.5.14:32178/", "qa", "qatest"),
DEV1("dev1", "dev1", "jdbc:mysql://172.17.5.16:32661/", "qa", "qatest"),
PRE("pre","pre", "jdbc:mysql://172.17.5.17:32178/", "qa", "qatest"),
QA("qa", "qa","jdbc:mysql://172.17.5.16:32743/", "qa", "qatest"),
QA2("qa2", "qa2", "jdbc:mysql://172.17.5.5:31905/", "qa", "qatest"),
QA3("qa3", "qa3","jdbc:mysql://172.17.5.14:32659/", "qa", "qatest"),
......@@ -12,8 +13,7 @@ public enum Namespace {
FE("fe", "fe", "jdbc:mysql://172.17.5.9:31024/", "qa", "qatest"),
VCC("vcc", "vcc", "jdbc:mysql://172.17.5.8:31110/", "qa", "qatest"),
VCC2("vcc2", "vcc2", "jdbc:mysql://172.17.5.12:30977/", "qa", "qatest"),
VCC3("vcc3", "vcc3", "jdbc:mysql://172.17.5.9:31393", "qa", "qatest"),
LOCALHOST("localhost", "localhost", "jdbc:mysql://127.0.0.1:3306/", "root", "123456");
VCC3("vcc3", "vcc3", "jdbc:mysql://172.17.5.9:31393/", "qa", "qatest");
private String key;
......
package cn.qg.qaplatform.mock.config;
import cn.qg.qaplatform.mock.interceptor.PayInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public PayInterceptor payInterceptor() {
return new PayInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(payInterceptor()).addPathPatterns("/mock/tzt-api/**");
}
}
package cn.qg.qaplatform.mock.controller;
import cn.qg.qaplatform.mock.service.MockService;
import cn.qg.qaplatform.utils.JsonResult;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.mock.entity.Mock;
import cn.qg.qaplatform.mock.mapper.MockMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@CrossOrigin
@RestController
public class MockController {
@Autowired
MockService mockService;
@RequestMapping(value = "/mock/**", method = { RequestMethod.GET, RequestMethod.POST})
public void mockMethod() {}
@PostMapping("/add/mock")
public JsonResult addMock(@RequestBody Mock mock) {
SwitchDataSource.dataSourceSwitch("pre", "qa");
return JsonResult.success(mockService.save(mock));
}
@GetMapping("/list/mock")
public JsonResult getMockList(Integer pageNum, Integer pageSize) {
SwitchDataSource.dataSourceSwitch("pre", "qa");
IPage<Mock> page = new Page<>(pageNum, pageSize);
IPage<Mock> pageEntity = mockService.page(page);
Map<String, Object> map = new HashMap<>();
map.put("list", pageEntity.getRecords());
map.put("total", pageEntity.getTotal());
return JsonResult.success(map);
}
@PostMapping("/edit/mock")
public JsonResult modifyMock(@RequestBody Mock mock) {
SwitchDataSource.dataSourceSwitch("pre", "qa");
return JsonResult.success(mockService.saveOrUpdate(mock));
}
}
package cn.qg.qaplatform.mock.encrypt.factory;
public interface EncryptConvertor {
String encrypt(String response);
String decrypt(String request);
}
package cn.qg.qaplatform.mock.encrypt.factory;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class EncryptFactory {
public static EncryptConvertor produce(String type) {
if ("yeebao".equals(type)) {
return new YeebaoEncryptConvertor();
} else {
log.info("请输入正确的加密类型类型!");
return null;
}
}
}
package cn.qg.qaplatform.mock.encrypt.factory;
import cn.qg.qaplatform.mock.encrypt.paycenter.Aes;
import cn.qg.qaplatform.mock.encrypt.paycenter.Rsa;
import cn.qg.qaplatform.utils.JsonTransUtils;
import java.util.Map;
public class YeebaoEncryptConvertor implements EncryptConvertor {
private final String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANSBQSc0Hlr+mS7uoIjYS71X2DJ6ZrCcbB1uICqty9QY6W16nZ8tLN/d9k2Z+e2rGG8s7PskpU2T+WuJeDSXs/vpPllG8/tSRVaWcr9EzPaSti3ltSUH0QOLSypZEjTT/slscExj4PMOmQXUXP3gewjNWz1cYRI7dGnKPm+ZFah/AgMBAAECgYB8AcFngz6DkzcI8C+2K6JnJ6/+JPdv8JgWxID45tqfNrphLMB2dwJM0VY+CrCSRNnJZsoT9FqSXtuaKWqAJlbchhPZjupA9RkWFzlGpCQ63/CC71RYYY03eCnc7AIpn52whkjfWG/yf57jKzEwUT+U034uvXdaA+lVvJ0xqpj3gQJBAOmLODjecn450TJbNQaop+7Q5Hz2TUIxbYakzPpcLGv1QYgHa657r7PJ23ZltDBGldMaNTZfqJrtDcq0rTA4lBECQQDo8CcdUhMZ3JbR2UZN0CG8ljMbNWgNWBa37ebE3ZG5yYldc7zY9US/+/7lhxNDqG0saTvM9pJwEc3ccVMvksOPAkEAqq7V+zIQKVJmItBn06MFgNNoei+kTUFEk8f0CvG8gXYwW5NYzp+UzOg1HbW82B9uNmeMBl4pInknwEMF5B0lkQJAdRxQPgCGk+kAdo6LNxHd9Ed7eEF4h8Ty3xQfgnh3DHYTtsU6e8WMBA24kENB3zEtejeKFjkdVHTPD/Z1wSRDZwJAAvNuq0YuRDsESOAerkBZKonA5CD0M4vHTRqihHrjBohv6yxBU8P7gALrX7qmoaZ3aLmN8wHdOAGTR6LZjQdkoQ==";
private String aesKey = null;
private String encryptKey = null;
/**
* 易宝加密
* @param response
* @return
*/
@Override
public String encrypt(String response) {
try {
Map responseMap = JsonTransUtils.strToMap(response);
responseMap.put("sign", Rsa.sign(response, privateKey));
responseMap.put("data", Aes.encryptToBase64(response, aesKey));
return JsonTransUtils.mapToJson(responseMap);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 易宝解密
* @param request Http请求的request
* @return
*/
@Override
public String decrypt(String request) {
try {
Map requestMap = JsonTransUtils.strToMap(request);
aesKey = Rsa.decrypt((String) requestMap.get("encryptkey"), privateKey);
return Aes.decryptFromBase64((String) requestMap.get("data"), aesKey);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
package cn.qg.qaplatform.mock.encrypt.paycenter;
public abstract class AbstractConvertUtils {
private AbstractConvertUtils() {
}
public static String toHex(byte input[]) {
if (input == null) {
return null;
}
StringBuffer output = new StringBuffer(input.length * 2);
for (int i = 0; i < input.length; i++) {
int current = input[i] & 0xff;
if (current < 16) {
output.append("0");
}
output.append(Integer.toString(current, 16));
}
return output.toString();
}
}
package cn.qg.qaplatform.mock.encrypt.paycenter;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class Aes {
private static final int KEY_LENGTH = 16;
/**
* 加密
*
* @param data 需要加密的内容
* @param key 加密密码
*/
public static byte[] encrypt(byte[] data, byte[] key) {
CheckUtils.notEmpty(data, "data");
CheckUtils.notEmpty(key, "key");
if (key.length != KEY_LENGTH) {
throw new RuntimeException("Invalid Aes key length (must be 16 bytes)");
}
try {
SecretKeySpec secretKey = new SecretKeySpec(key, "Aes");
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec seckey = new SecretKeySpec(enCodeFormat, "Aes");
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.AES_ALGORITHM);// 创建密码器
cipher.init(Cipher.ENCRYPT_MODE, seckey);// 初始化
byte[] result = cipher.doFinal(data);
return result; // 加密
} catch (Exception e) {
throw new RuntimeException("encrypt fail!", e);
}
}
/**
* 解密
*
* @param data 待解密内容
* @param key 解密密钥
*/
public static byte[] decrypt(byte[] data, byte[] key) {
CheckUtils.notEmpty(data, "data");
CheckUtils.notEmpty(key, "key");
if (key.length != KEY_LENGTH) {
throw new RuntimeException("Invalid Aes key length (must be 16 bytes)");
}
try {
SecretKeySpec secretKey = new SecretKeySpec(key, "Aes");
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec seckey = new SecretKeySpec(enCodeFormat, "Aes");
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.AES_ALGORITHM);// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, seckey);// 初始化
byte[] result = cipher.doFinal(data);
return result; // 加密
} catch (Exception e) {
throw new RuntimeException("decrypt fail!", e);
}
}
public static String encryptToBase64(String data, String key) {
try {
byte[] valueByte = encrypt(data.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING),
key.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING));
return new String(Base64.encode(valueByte));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("encrypt fail!", e);
}
}
public static String decryptFromBase64(String data, String key) {
try {
byte[] originalData = Base64.decode(data.getBytes());
byte[] valueByte =
decrypt(originalData, key.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING));
return new String(valueByte, ConfigureEncryptAndDecrypt.CHAR_ENCODING);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("decrypt fail!", e);
}
}
public static String encryptWithKeyBase64(String data, String key) {
try {
byte[] valueByte = encrypt(data.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING),
Base64.decode(key.getBytes()));
return new String(Base64.encode(valueByte));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("encrypt fail!", e);
}
}
public static String decryptWithKeyBase64(String data, String key) {
try {
byte[] originalData = Base64.decode(data.getBytes());
byte[] valueByte = decrypt(originalData, Base64.decode(key.getBytes()));
return new String(valueByte, ConfigureEncryptAndDecrypt.CHAR_ENCODING);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("decrypt fail!", e);
}
}
public static byte[] genarateRandomKey() {
KeyGenerator keygen = null;
try {
keygen = KeyGenerator.getInstance(ConfigureEncryptAndDecrypt.AES_ALGORITHM);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(" genarateRandomKey fail!", e);
}
SecureRandom random = new SecureRandom();
keygen.init(random);
Key key = keygen.generateKey();
return key.getEncoded();
}
public static String genarateRandomKeyWithBase64() {
return new String(Base64.encode(genarateRandomKey()));
}
}
package cn.qg.qaplatform.mock.encrypt.paycenter;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;
public class CheckUtils {
/**
* 验证对象是否为NULL,空字符串,空数组,空的Collection或Map(只有空格的字符串也认为是空串)
*
* @param obj 被验证的对象
* @param message 异常信息
*/
@SuppressWarnings("rawtypes")
public static void notEmpty(Object obj, String message) {
if (obj == null) {
throw new IllegalArgumentException(message + " must be specified");
}
if (obj instanceof String && obj.toString().trim().length() == 0) {
throw new IllegalArgumentException(message + " must be specified");
}
if (obj.getClass().isArray() && Array.getLength(obj) == 0) {
throw new IllegalArgumentException(message + " must be specified");
}
if (obj instanceof Collection && ((Collection) obj).isEmpty()) {
throw new IllegalArgumentException(message + " must be specified");
}
if (obj instanceof Map && ((Map) obj).isEmpty()) {
throw new IllegalArgumentException(message + " must be specified");
}
}
}
package cn.qg.qaplatform.mock.encrypt.paycenter;
public class ConfigureEncryptAndDecrypt {
public static final String CHAR_ENCODING = "UTF-8";
public static final String AES_ALGORITHM = "Aes/ECB/PKCS5Padding";
public static final String RSA_ALGORITHM = "Rsa/ECB/PKCS1Padding";
}
package cn.qg.qaplatform.mock.encrypt.paycenter;
import lombok.extern.slf4j.Slf4j;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
@Slf4j
public class Digest {
public static final String ENCODE = "UTF-8";
public static String signMD5(String aValue, String encoding) {
try {
byte[] input = aValue.getBytes(encoding);
MessageDigest md = MessageDigest.getInstance("MD5");
return AbstractConvertUtils.toHex(md.digest(input));
} catch (NoSuchAlgorithmException e) {
log.error("{}", e);
return null;
} catch (UnsupportedEncodingException e) {
log.error("{}", e);
return null;
}
}
public static String hmacSign(String aValue) {
try {
byte[] input = aValue.getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
return AbstractConvertUtils.toHex(md.digest(input));
} catch (NoSuchAlgorithmException e) {
log.error("{}", e);
return null;
}
}
public static String hmacSign(String aValue, String aKey) {
return hmacSign(aValue, aKey, ENCODE);
}
public static String hmacSign(String aValue, String aKey, String encoding) {
byte k_ipad[] = new byte[64];
byte k_opad[] = new byte[64];
byte keyb[];
byte value[];
try {
keyb = aKey.getBytes(encoding);
value = aValue.getBytes(encoding);
} catch (UnsupportedEncodingException e) {
keyb = aKey.getBytes();
value = aValue.getBytes();
}
Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
for (int i = 0; i < keyb.length; i++) {
k_ipad[i] = (byte) (keyb[i] ^ 0x36);
k_opad[i] = (byte) (keyb[i] ^ 0x5c);
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
log.error("{}", e);
return null;
}
md.update(k_ipad);
md.update(value);
byte dg[] = md.digest();
md.reset();
md.update(k_opad);
md.update(dg, 0, 16);
dg = md.digest();
return AbstractConvertUtils.toHex(dg);
}
public static String hmacSHASign(String aValue, String aKey, String encoding) {
byte k_ipad[] = new byte[64];
byte k_opad[] = new byte[64];
byte keyb[];
byte value[];
try {
keyb = aKey.getBytes(encoding);
value = aValue.getBytes(encoding);
} catch (UnsupportedEncodingException e) {
keyb = aKey.getBytes();
value = aValue.getBytes();
}
Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
for (int i = 0; i < keyb.length; i++) {
k_ipad[i] = (byte) (keyb[i] ^ 0x36);
k_opad[i] = (byte) (keyb[i] ^ 0x5c);
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA");
} catch (NoSuchAlgorithmException e) {
log.error("{}", e);
return null;
}
md.update(k_ipad);
md.update(value);
byte dg[] = md.digest();
md.reset();
md.update(k_opad);
md.update(dg, 0, 20);
dg = md.digest();
return AbstractConvertUtils.toHex(dg);
}
public static String digest(String aValue) {
return digest(aValue, ENCODE);
}
public static String digest(String aValue, String encoding) {
aValue = aValue.trim();
byte value[];
try {
value = aValue.getBytes(encoding);
} catch (UnsupportedEncodingException e) {
value = aValue.getBytes();
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA");
} catch (NoSuchAlgorithmException e) {
log.error("{}", e);
return null;
}
return AbstractConvertUtils.toHex(md.digest(value));
}
public static String digest(String aValue, String alg, String encoding) {
aValue = aValue.trim();
byte value[];
try {
value = aValue.getBytes(encoding);
} catch (UnsupportedEncodingException e) {
value = aValue.getBytes();
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance(alg);
} catch (NoSuchAlgorithmException e) {
log.error("{}", e);
return null;
}
return AbstractConvertUtils.toHex(md.digest(value));
}
public static String udpSign(String aValue) {
try {
byte[] input = aValue.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("SHA1");
return new String(Base64.encode(md.digest(input)), ENCODE);
} catch (Exception e) {
return null;
}
}
}
package cn.qg.qaplatform.mock.encrypt.paycenter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.Map.Entry;
import java.util.TreeMap;
@Slf4j
public class EncryUtil {
/**
* 生成RSA签名
*/
public static String handleRSA(TreeMap<String, Object> map,
String privateKey) {
StringBuffer sbuffer = new StringBuffer();
for (Entry<String, Object> entry : map.entrySet()) {
sbuffer.append(entry.getValue());
}
String signTemp = sbuffer.toString();
String sign = "";
if (StringUtils.isNotEmpty(privateKey)) {
sign = Rsa.sign(signTemp, privateKey);
}
return sign;
}
/**
* 对易宝支付返回的结果进行验签
*
* @param data 易宝支付返回的业务数据密文
* @param encrypt_key 易宝支付返回的对ybAesKey加密后的密文
* @param yibaoPublickKey 易宝支付提供的公钥
* @param merchantPrivateKey 商户自己的私钥
* @return 验签是否通过
* @throws Exception
*/
public static boolean checkDecryptAndSign(String data, String encrypt_key,
String yibaoPublickKey, String merchantPrivateKey) {
/** 1.使用YBprivatekey解开aesEncrypt。 */
String AESKey;
try {
AESKey = Rsa.decrypt(encrypt_key, merchantPrivateKey);
} catch (Exception e) {
/** AES密钥解密失败 */
log.error("{}", e);
return false;
}
/** 2.用aeskey解开data。取得data明文 */
String realData = Aes.decryptFromBase64(data, AESKey);
TreeMap<String, String> map = JSON.parseObject(realData,
new TypeReference<TreeMap<String, String>>() {
});
/** 3.取得data明文sign。 */
String sign = StringUtils.trimToEmpty(map.get("sign"));
StringBuilder signData = new StringBuilder();
for (Entry<String, String> entry : map.entrySet()) {
if (StringUtils.equals(entry.getKey(), "sign")) {
continue;
}
signData.append(entry.getValue() == null ? "" : entry.getValue());
}
/** 5. result为true时表明验签通过 */
String str = signData.toString();
return Rsa.checkSign(str, sign,
yibaoPublickKey);
}
}
package cn.qg.qaplatform.mock.encrypt.paycenter;
import java.security.SecureRandom;
public class RandomUtil {
public static final SecureRandom random = new SecureRandom();
public static String getRandom(int length) {
StringBuilder ret = new StringBuilder();
for (int i = 0; i < length; i++) {
boolean isChar = (random.nextInt(2) % 2 == 0);// 输出字母还是数字
if (isChar) { // 字符串
int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; // 取得大写字母还是小写字母
ret.append((char) (choice + random.nextInt(26)));
} else { // 数字
ret.append(Integer.toString(random.nextInt(10)));
}
}
return ret.toString();
}
}
package cn.qg.qaplatform.mock.encrypt.paycenter;
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Rsa {
/**
* 指定key的大小
*/
private static int KEYSIZE = 1024;
/**
* 生成密钥对
*/
public static Map<String, String> generateKeyPair() throws Exception {
/** RSA算法要求有一个可信任的随机数源 */
SecureRandom sr = new SecureRandom();
/** 为RSA算法创建一个KeyPairGenerator对象 */
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Rsa");
/** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */
kpg.initialize(KEYSIZE, sr);
/** 生成密匙对 */
KeyPair kp = kpg.generateKeyPair();
/** 得到公钥 */
Key publicKey = kp.getPublic();
byte[] publicKeyBytes = publicKey.getEncoded();
String pub = new String(Base64.encodeBase64(publicKeyBytes),
ConfigureEncryptAndDecrypt.CHAR_ENCODING);
/** 得到私钥 */
Key privateKey = kp.getPrivate();
byte[] privateKeyBytes = privateKey.getEncoded();
String pri = new String(Base64.encodeBase64(privateKeyBytes),
ConfigureEncryptAndDecrypt.CHAR_ENCODING);
Map<String, String> map = new HashMap<String, String>();
map.put("publicKey", pub);
map.put("privateKey", pri);
RSAPublicKey rsp = (RSAPublicKey) kp.getPublic();
BigInteger bint = rsp.getModulus();
byte[] b = bint.toByteArray();
byte[] deBase64Value = Base64.encodeBase64(b);
String retValue = new String(deBase64Value);
map.put("modulus", retValue);
return map;
}
/**
* 加密方法 source: 源数据
*/
public static String encrypt(String source, String publicKey)
throws Exception {
Key key = getPublicKey(publicKey);
/** 得到Cipher对象来实现对源数据的RSA加密 */
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.RSA_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] b = source.getBytes();
/** 执行加密操作 */
byte[] b1 = cipher.doFinal(b);
return new String(Base64.encodeBase64(b1),
ConfigureEncryptAndDecrypt.CHAR_ENCODING);
}
/**
* 解密算法 cryptograph:密文
*/
public static String decrypt(String cryptograph, String privateKey)
throws Exception {
Key key = getPrivateKey(privateKey);
/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.RSA_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] b1 = Base64.decodeBase64(cryptograph.getBytes());
/** 执行解密操作 */
byte[] b = cipher.doFinal(b1);
return new String(b);
}
/**
* 得到公钥
*
* @param key 密钥字符串(经过base64编码)
* @throws Exception
*/
public static PublicKey getPublicKey(String key) throws Exception {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(
Base64.decodeBase64(key.getBytes()));
KeyFactory keyFactory = KeyFactory.getInstance("Rsa");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
/**
* 得到私钥
*
* @param key 密钥字符串(经过base64编码)
* @throws Exception
*/
public static PrivateKey getPrivateKey(String key) throws Exception {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(
Base64.decodeBase64(key.getBytes()));
KeyFactory keyFactory = KeyFactory.getInstance("Rsa");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
public static String sign(String content, String privateKey) {
String charset = ConfigureEncryptAndDecrypt.CHAR_ENCODING;
try {
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
Base64.decodeBase64(privateKey.getBytes()));
KeyFactory keyf = KeyFactory.getInstance("Rsa");
PrivateKey priKey = keyf.generatePrivate(priPKCS8);
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initSign(priKey);
signature.update(content.getBytes(charset));
byte[] signed = signature.sign();
return new String(Base64.encodeBase64(signed));
} catch (Exception e) {
}
return null;
}
public static boolean checkSign(String content, String sign, String publicKey) {
try {
KeyFactory keyFactory = KeyFactory.getInstance("Rsa");
byte[] encodedKey = Base64.decode2(publicKey);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
Signature signature = Signature
.getInstance("SHA1WithRSA");
signature.initVerify(pubKey);
signature.update(content.getBytes("utf-8"));
boolean bverify = signature.verify(Base64.decode2(sign));
return bverify;
} catch (Exception e) {
log.error("{}", e);
}
return false;
}
}
package cn.qg.qaplatform.mock.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class Mock {
@TableId(type = IdType.AUTO)
private Integer id;
private String url;
private String description;
private String success;
private String fail;
private Integer flag;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package cn.qg.qaplatform.mock.interceptor;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.mock.encrypt.factory.EncryptConvertor;
import cn.qg.qaplatform.mock.encrypt.factory.EncryptFactory;
import cn.qg.qaplatform.mock.encrypt.paycenter.Aes;
import cn.qg.qaplatform.mock.encrypt.paycenter.Rsa;
import cn.qg.qaplatform.mock.entity.Mock;
import cn.qg.qaplatform.mock.mapper.MockMapper;
import cn.qg.qaplatform.utils.JsonTransUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class PayInterceptor implements HandlerInterceptor {
@Autowired
MockMapper mockMapper;
// @Value("${namespace}")
private String namespace = "pre";
/**
* 获取HttpServletRequest的body
* @param request HttpServletRequest
* @return
* @throws IOException
*/
private String getRequestBody(HttpServletRequest request) throws IOException {
BufferedReader br = request.getReader();
String str;
StringBuilder wholeStr = new StringBuilder();
while((str = br.readLine()) != null){
wholeStr.append(str);
}
return wholeStr.toString();
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
SwitchDataSource.dataSourceSwitch(namespace, "qa");
String uri = request.getRequestURI().substring(5);
QueryWrapper<Mock> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("url", uri);
Mock mock = mockMapper.selectOne(queryWrapper);
response.setHeader("Content-type", "application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter = response.getWriter();
// 对request进行解密
EncryptConvertor encryptConvertor = EncryptFactory.produce("yeebao");
Map<String, Object> requestMap = JsonTransUtils.strToMap(encryptConvertor.decrypt(getRequestBody(request)));
Map<String, Object> responseMap = new HashMap<>();
if (mock.getFlag().equals(1)) {
responseMap = JsonTransUtils.strToMap(mock.getSuccess());
} else if (mock.getFlag().equals(0)) {
responseMap = JsonTransUtils.strToMap(mock.getFail());
}
// 如果response中存在变量,则使用requestMap中对应变量进行替换
for (Map.Entry<String, Object> entry: responseMap.entrySet()) {
String value = (String) entry.getValue();
if (value.startsWith("$request")) {
entry.setValue(requestMap.get(value.split("\\.")[1]));
}
}
// 对response加密
printWriter.write(encryptConvertor.encrypt(JsonTransUtils.mapToJson(responseMap)));
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
// 对请求加密
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
log.info("calling afterCompletion");
}
public static void main(String[] args) {
}
}
package cn.qg.qaplatform.mock.mapper;
import cn.qg.qaplatform.mock.entity.Mock;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface MockMapper extends BaseMapper<Mock> {
}
package cn.qg.qaplatform.mock.service;
import cn.qg.qaplatform.mock.entity.Mock;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
public interface MockService extends IService<Mock> {
}
package cn.qg.qaplatform.mock.service.impl;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.mock.entity.Mock;
import cn.qg.qaplatform.mock.mapper.MockMapper;
import cn.qg.qaplatform.mock.service.MockService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MockServiceImpl extends ServiceImpl<MockMapper, Mock> implements MockService {
}
package cn.qg.qaplatform.stools.controller;
import cn.qg.qaplatform.stools.utils.JenkinsApi;
import cn.qg.qaplatform.stools.vo.JenkinsBuildInfo;
import cn.qg.qaplatform.utils.JsonResult;
import com.offbytwo.jenkins.model.Build;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@CrossOrigin
@RestController
@RequestMapping("/jenkins")
public class JenkinsBuildController {
/**
* 获取构建信息列表
* @param jobName 任务名称
* @param num 获取的数量
* @param project 项目名,非必填
* @return 构建信息列表
* @throws IOException
*/
@GetMapping("/buildlist")
public JsonResult getLatestBuildInfo(@RequestParam String jobName,
@RequestParam Integer num,
@RequestParam(required = false) String project) throws IOException {
JenkinsApi jenkinsApi = new JenkinsApi();
List<Build> buildList;
if (project == null) {
buildList = jenkinsApi.getJobBuildList(jobName, num);
} else {
buildList = jenkinsApi.getJobBuildList(jobName, num, project);
}
List<JenkinsBuildInfo> jenkinsBuildInfoList = new ArrayList<>();
for (Build build: buildList) {
JenkinsBuildInfo jenkinsBuildInfo = new JenkinsBuildInfo();
jenkinsBuildInfo.setProject(build.details().getParameters().get("GIT_REPO"));
jenkinsBuildInfo.setBranch(build.details().getParameters().get("BRANCH_NAME"));
jenkinsBuildInfo.setNamespace(build.details().getParameters().get("NAMESPACE"));
jenkinsBuildInfo.setUserName(build.details().getCauses().get(0).getUserName());
jenkinsBuildInfo.setResult(build.details().getResult().toString());
jenkinsBuildInfo.setCreateAt(new Date(build.details().getTimestamp()));
jenkinsBuildInfoList.add(jenkinsBuildInfo);
}
return JsonResult.success(jenkinsBuildInfoList);
}
/**
* 获取job列表
* @return
*/
@GetMapping("/joblist")
public JsonResult getJenkinsJobList() {
JenkinsApi jenkinsApi = new JenkinsApi();
return JsonResult.success(jenkinsApi.getJobList());
}
}
package cn.qg.qaplatform.stools.controller;
import cn.qg.qaplatform.utils.JsonResult;
import cn.qg.qaplatform.stools.utils.kdsp.AESUtil;
import cn.qg.qaplatform.stools.utils.kdsp.RSA;
import cn.qg.qaplatform.stools.vo.EncryptRequest;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.UUID;
@CrossOrigin
@Api(tags = "kdsp加解密接口")
@RestController
@RequestMapping("/kdsp")
public class KdspDecryptController {
private final String APP_PRIMARY_KEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIZ/jCc0lcdcznjCybFPCGmI9oCnbvMzdCyta7X4Y4ygIOYAQ5vaNiPI2HAEh5X15jR/Cgr4x9YHLBuifKnJezWPmX+ZOYVFDwhlj7FkXS3TVyiuegykomdyg2LCpz06eyLAY+rMiz+ItqUGiemmqFZKfSD328VLaqCvRac5aWotAgMBAAECgYA8E1Kt3F4ee4S6Cf9/FFcklInOc3sqZEw6/IdE85q7oHaxZWLNhY1zNG4AsvVA9WILBsecmPzhy7hW66AVUqqWXA8jLIg/J3UyIRQo1sH9cX+3iERhNZluxXzxcX/UXrVQihyEFWZbehtpXFfPq1F7XzkTKy8qSodRLO79F8Tc/QJBAOF2vZ4Ah8GhiZP/KMYX7Q1fY5x/zTKmnNs1fJGDoRmgcF47Inzf2Ovjo+do/QdCf+Bzki6WG0AOpIHKksuw5r8CQQCYtttPfP8FKRxumcczNmkaKDWjrKElwRcGef5OuNBb7Crso9gUY+sL9/4kQHfmBfCS6KVbAA56RSdeSWFYZDYTAkA58pbRoTlDHw2JKC+Gmmem5Dlp478NoZz3Ckw16irht0aqMXCvv6i1GBDsTSObVhAf1BRiPNpMIHdPlI0eJR1pAkA7Oge6P0cEcFpHhrpb4UlHzLpo3QWuh8FvUJbRXxnn3KMVHcIqvkmlXauh0aLugfU4dKPUtCPpRbKr/ZeUWWEjAkAN5D5hH16RwrR6KN8W7t0gnlwOECPD8KbBQeWSja9r8C/yWMmr4RsWirBoDSYu4IG8jnrNcmYk8l1eAWmNyJWe";
@ApiOperation(value = "kdsp提交订单解密接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "data", value = "待解密的json串", required = true)})
@GetMapping("/decrypt")
public JsonResult decryptKdsp(String data) throws Exception {
EncryptRequest encryptRequest = JSON.parseObject(data, EncryptRequest.class);
//使用服务端私钥对AES key进行解密
String encryptKey = RSA.decryptFromBase64(encryptRequest.getEncryptKey(), APP_PRIMARY_KEY);
String result = AESUtil.decryptFromBase64(encryptRequest.getBody(), encryptKey);
return JsonResult.success(result);
}
@ApiOperation(value = "kdsp提交订单加密接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "data", value = "待加密的json串", required = true)})
@GetMapping("/encrypt")
public JsonResult encryptKdsp(String data) throws Exception {
EncryptRequest encryptRequest = new EncryptRequest();
//加密过程
String appId = "102";
String SERVER_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGf4wnNJXHXM54wsmxTwhpiPaAp27zM3QsrWu1+GOMoCDmAEOb2jYjyNhwBIeV9eY0fwoK+MfWBywbonypyXs1j5l/mTmFRQ8IZY+xZF0t01cornoMpKJncoNiwqc9OnsiwGPqzIs/iLalBonppqhWSn0g99vFS2qgr0WnOWlqLQIDAQAB";
String nonce = UUID.randomUUID().toString();
String timeStamp = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
//生成AES key
String randomKey = AESUtil.getRandomKey();
//使用AES key对业务数据进行加密
String encodeBody = AESUtil.encryptToBase64(data, randomKey);
String body = appId + nonce + timeStamp + encodeBody;
//使用私钥进行签名
String sign = RSA.sign(body, APP_PRIMARY_KEY);
//使用服务端公钥对AES key进行加密
String encryptKey = RSA.encryptToBase64(randomKey, SERVER_PUBLIC_KEY);
encryptRequest.setAppId(appId);
encryptRequest.setEncryptKey(encryptKey);
encryptRequest.setBody(encodeBody);
encryptRequest.setSign(sign);
encryptRequest.setNonce(nonce);
encryptRequest.setTimestamp(timeStamp);
return JsonResult.success(JSON.toJSONString(encryptRequest));
}
}
package cn.qg.qaplatform.stools.utils;
import com.offbytwo.jenkins.JenkinsServer;
import com.offbytwo.jenkins.model.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;
/**
* 操作Jenkins的api
*/
public class JenkinsApi {
// Jenkins 对象
private JenkinsServer jenkinsServer;
// http 客户端对象
// private JenkinsHttpClient jenkinsHttpClient;
// 连接 Jenkins 需要设置的信息
static final String JENKINS_URL = "http://192.168.4.96:8080/";
static final String JENKINS_USERNAME = "qahome";
static final String JENKINS_PASSWORD = "Quantgroup123";
/**
* 构造方法中调用连接 Jenkins 方法
*/
public JenkinsApi() {
// 连接 Jenkins
try {
jenkinsServer = new JenkinsServer(new URI(JENKINS_URL), JENKINS_USERNAME, JENKINS_PASSWORD);
} catch (URISyntaxException e) {
e.printStackTrace();
}
// 设置客户端连接 Jenkins
// try {
// jenkinsHttpClient = new JenkinsHttpClient(new URI(JENKINS_URL), JENKINS_USERNAME, JENKINS_PASSWORD);
// } catch (URISyntaxException e) {
// e.printStackTrace();
// }
}
/**
* 根据job名称获取job信息
*/
public JobWithDetails getJobInfoByName(String jobName) {
try {
JobWithDetails job = jenkinsServer.getJob(jobName);
return job;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 获取job列表
* @return
*/
public List<Map<String, String>> getJobList() {
try {
Map<String, Job> jobs = jenkinsServer.getJobs();
List<Map<String, String>> jobList = new ArrayList<>();
for (Job job:jobs.values()){
Map<String, String> map = new HashMap<>();
map.put("value", job.getName());
map.put("label", job.getName());
jobList.add(map);
}
return jobList;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 获取Job Build列表
*/
public List<Build> getJobBuildList(String jobName, Integer num) {
try {
// 获取 Job 信息
JobWithDetails job = jenkinsServer.getJob(jobName);
// 获取全部 Build 信息
Build lastBuild = job.getLastBuild();
int lastBuildNumber = lastBuild.getNumber();
List<Build> buildList = new ArrayList<>();
for (int i = lastBuildNumber; i > lastBuildNumber - num; i--) {
Build tempBuild = job.getBuildByNumber(i);
if (tempBuild == null) {
return buildList;
} else {
buildList.add(job.getBuildByNumber(i));
}
}
return buildList;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 根据参数获取对应的build
*/
public List<Build> getJobBuildList(String jobName, Integer num, String project) {
try {
// 获取 Job 信息
JobWithDetails job = jenkinsServer.getJob(jobName);
int lastBuildNumber = job.getLastBuild().getNumber();
List<Build> buildList = new ArrayList<>();
int caculator = 0;
while (buildList.size() != num) {
Build build = job.getBuildByNumber(lastBuildNumber - caculator);
if (build == null) {
return buildList;
}
if (build.details().getParameters().get("GIT_REPO").equals(project)) {
buildList.add(build);
}
caculator += 1;
}
return buildList;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) throws IOException {
JenkinsApi jenkinsApi = new JenkinsApi();
List<Build> buildList = jenkinsApi.getJobBuildList("tke-java", 1, "kdsp");
List<String> userList = new ArrayList<>();
for (Build build: buildList) {
System.out.println(build.details().getParameters().get("BRANCH_NAME"));
System.out.println(build.details().getParameters().get("NAMESPACE"));
System.out.println(build.details().getCauses().get(0).getUserName());
userList.add(build.details().getCauses().get(0).getUserName());
BuildResult buildResult = build.details().getResult();
System.out.println(buildResult);
}
System.out.println(userList.size());
}
}
package cn.qg.qaplatform.stools.utils.kdsp;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
/**
* kdsp
* AES对称加密工具类
*/
public class AESUtil {
private static final String CHAR_LIBRARY = "1234567890abcdefghijklmnopqrstuvwxyz";
private static final int KEY_SIZE = 16;
/**
* 生成16位随机密钥
*
* @return
*/
public static String getRandomKey() {
StringBuilder result = new StringBuilder();
for (int i = 0; i < KEY_SIZE; i++) {
int randomIdx = (int) (Math.random() * (CHAR_LIBRARY.length() - 1));
result.append(CHAR_LIBRARY.charAt(randomIdx));
}
return result.toString();
}
// 加密
public static String encryptToBase64(String sSrc, String sKey) throws Exception {
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.println(sKey);
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = sKey.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING);
for (byte b : raw) {
System.out.println("======" + b);
}
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.AES_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING));
// 此处使用BASE64做转码功能,同时能起到2次加密的作用。
return new String(Base64.getEncoder().encode(encrypted), ConfigureEncryptAndDecrypt.CHAR_ENCODING);
}
// 解密
public static String decryptFromBase64(String sSrc, String sKey) throws Exception {
// 判断Key是否正确
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
// byte[] raw = sKey.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING);
byte[] raw = sKey.getBytes();
// byte[] raw = sKey.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.AES_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(raw));
// 先用base64解密
byte[] encrypted1 = Base64.getDecoder().decode(sSrc.getBytes());
byte[] original = cipher.doFinal(encrypted1);
return new String(original);
// return new String(original, ConfigureEncryptAndDecrypt.CHAR_ENCODING);
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100; i++) {
System.out.println(getRandomKey());
}
/*
* 此处使用AES-128-ECB加密模式,key需要为16位。
String cKey = "12345678901a3456";
// 需要加密的字串
String cSrc = "www.gowhere.so中文";
System.out.println(cSrc);
// 加密
String enString = AES.encryptToBase64(cSrc, cKey);
System.out.println("加密后的字串是:" + enString);
// 解密
String DeString = AES.decryptFromBase64(enString, cKey);
System.out.println("解密后的字串是:" + DeString);*/
}
}
package cn.qg.qaplatform.stools.utils.kdsp;
public class ConfigureEncryptAndDecrypt {
public static final String CHAR_ENCODING = "UTF-8";
// public static final String AES_ALGORITHM = "AES/ECB/PKCS5Padding"; // "算法/模式/补码方式"
public static final String AES_ALGORITHM = "AES/CBC/PKCS5Padding"; // "算法/模式/补码方式"
// public static final String AES_ALGORITHM = "AES/CBC/PKCS7Padding"; // "算法/模式/补码方式"
public static final String RSA_ALGORITHM = "RSA/ECB/PKCS1Padding"; // "算法/模式/补码方式"
}
\ No newline at end of file
package cn.qg.qaplatform.stools.utils.kdsp;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;
/**
* kdsp
* RSA非对称加密工具类
*/
public class RSA {
/** 指定key的大小 */
private static int KEYSIZE = 1024;
/**
* 生成密钥对
*/
public static Map<String, String> generateKeyPair() throws Exception {
/** RSA算法要求有一个可信任的随机数源 */
SecureRandom sr = new SecureRandom();
/** 为RSA算法创建一个KeyPairGenerator对象 */
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
/** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */
kpg.initialize(KEYSIZE, sr);
/** 生成密匙对 */
KeyPair kp = kpg.generateKeyPair();
/** 得到公钥 */
Key publicKey = kp.getPublic();
byte[] publicKeyBytes = publicKey.getEncoded();
String pub = new String(Base64.getEncoder().encode(publicKeyBytes), ConfigureEncryptAndDecrypt.CHAR_ENCODING);
/** 得到私钥 */
Key privateKey = kp.getPrivate();
byte[] privateKeyBytes = privateKey.getEncoded();
String pri = new String(Base64.getEncoder().encode(privateKeyBytes), ConfigureEncryptAndDecrypt.CHAR_ENCODING);
Map<String, String> map = new HashMap<String, String>();
map.put("publicKey", pub);
map.put("privateKey", pri);
return map;
}
/**
* 使用私钥生成签名
* @param content
* @param privateKey
* @return
* @throws Exception
*/
public static String sign(String content, String privateKey) throws Exception {
PrivateKey priKey = getPrivateKey(privateKey);
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initSign(priKey);
signature.update(content.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING));
byte[] signed = signature.sign();
return new String(Base64.getEncoder().encode(signed), ConfigureEncryptAndDecrypt.CHAR_ENCODING);
}
/**
* 使用公钥验证签名
* @param content
* @param sign 签名
* @param publicKey
* @return
* @throws Exception
*/
public static boolean checkSign(String content, String sign, String publicKey) throws Exception {
PublicKey pubKey = getPublicKey(publicKey);
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initVerify(pubKey);
signature.update(content.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING));
return signature.verify(Base64.getDecoder().decode(sign));
}
/**
* 加密方法
* @param source 明文
* @param publicKey 公钥
* @return
* @throws Exception
*/
public static String encryptToBase64(String source, String publicKey) throws Exception {
Key key = getPublicKey(publicKey);
/** 得到Cipher对象来实现对源数据的RSA加密 */
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.RSA_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] b = source.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING);
/** 执行加密操作 */
byte[] b1 = cipher.doFinal(b);
return new String(Base64.getEncoder().encode(b1), ConfigureEncryptAndDecrypt.CHAR_ENCODING);
}
/**
* 解密算法
* @param cryptograph 密文
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static String decryptFromBase64(String cryptograph, String privateKey) throws Exception {
Key key = getPrivateKey(privateKey);
/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.RSA_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] b1 = Base64.getDecoder().decode(cryptograph.getBytes());
/** 执行解密操作 */
byte[] b = cipher.doFinal(b1);
return new String(b);
}
/**
* 得到私钥
* @param key 密钥字符串(经过base64编码)
* @throws Exception
*/
private static PrivateKey getPrivateKey(String key) throws Exception {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(
Base64.getDecoder().decode(key.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING)));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
/**
* 得到公钥
* @param key 密钥字符串(经过base64编码)
* @throws Exception
*/
private static PublicKey getPublicKey(String key) throws Exception {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(
Base64.getDecoder().decode(key.getBytes(ConfigureEncryptAndDecrypt.CHAR_ENCODING)));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
public static void main(String[] args) throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(KEYSIZE);
KeyPair kp = kpg.generateKeyPair();
String privateKey = new String(Base64.getEncoder().encode(kp.getPrivate().getEncoded()));
String publicKey = new String(Base64.getEncoder().encode(kp.getPublic().getEncoded()));
System.out.println(privateKey);
System.out.println(publicKey);
}
}
package cn.qg.qaplatform.stools.vo;
import lombok.Data;
import java.io.Serializable;
/**
* kdsp提交订单加密相关
*/
@Data
public class EncryptRequest implements Serializable {
private static final long serialVersionUID = -1660123609661052319L;
private String appId;
private String sign;
private String nonce;
private String timestamp;
private String encryptKey;
private String body;
/**
* 下面是解密后的请求报文
*/
private String decBody;
}
package cn.qg.qaplatform.stools.vo;
import lombok.Data;
import java.util.Date;
/**
* Jenkins 构建信息
*/
@Data
public class JenkinsBuildInfo {
public String namespace;
public String project;
public String branch;
public String userName;
public String result;
public Date createAt;
}
package cn.qg.qaplatform.utils;
import cn.qg.qaplatform.common.enums.Namespace;
import cn.qg.qaplatform.enums.Namespace;
import org.apache.commons.dbutils.QueryRunner;
import java.sql.*;
......
package cn.qg.qaplatform.common;
package cn.qg.qaplatform.utils;
import cn.qg.qaplatform.common.enums.ErrorType;
import cn.qg.qaplatform.enums.ErrorType;
import lombok.Data;
/**
......
package cn.qg.qaplatform.utils.Encrypt;
package cn.qg.qaplatform.zdata.Encrypt;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
......
package cn.qg.qaplatform.zdata.controller;
package cn.qg.qaplatform.zdata.controller.vcc;
import cn.qg.qaplatform.common.JsonResult;
import cn.qg.qaplatform.zdata.domain.GenVccUser;
import cn.qg.qaplatform.zdata.service.VccDataService;
import cn.qg.qaplatform.utils.JsonResult;
import cn.qg.qaplatform.zdata.entity.VccOpenResultVo;
import cn.qg.qaplatform.zdata.service.vcc.VccDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("vcc")
@Api(tags = "vcc造数据")
public class GenVccController {
public class VccGenController {
@Autowired
VccDataService vccDataService;
......@@ -29,7 +29,7 @@ public class GenVccController {
if (!channel.equals("214") && !channel.equals("217")) {
return JsonResult.clientFailed("渠道必须为214或217");
}
GenVccUser result = vccDataService.makeVccUser(namespace, phoneNo, channel, status);
VccOpenResultVo result = vccDataService.makeVccUser(namespace, phoneNo, channel, status);
if (result == null) {
return JsonResult.serverFailed();
}
......
package cn.qg.qaplatform.zdata.controller;
package cn.qg.qaplatform.zdata.controller.vcc;
import cn.qg.qaplatform.common.JsonResult;
import cn.qg.qaplatform.utils.JsonResult;
import cn.qg.qaplatform.zdata.enums.VccStatusEnum;
import cn.qg.qaplatform.zdata.domain.QueryVccUser;
import cn.qg.qaplatform.zdata.service.VccDataService;
import cn.qg.qaplatform.zdata.entity.VccUserEntity;
import cn.qg.qaplatform.zdata.service.vcc.VccDataService;
import cn.qg.qaplatform.utils.page.PageResult;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -12,9 +13,10 @@ import java.util.HashMap;
import java.util.Map;
@CrossOrigin
@Api(tags = "vcc查询")
@RestController
@RequestMapping("/vcc")
public class QueryVccController {
public class VccQueryController {
@Autowired
VccDataService vccDataService;
......@@ -30,27 +32,27 @@ public class QueryVccController {
@GetMapping("/getStatus")
public JsonResult getUserStatus(String namespace, String phoneNo) {
QueryVccUser queryVccUser = vccDataService.queryUserVccStatus(namespace, phoneNo);
if (queryVccUser == null) {
VccUserEntity vccUserEntity = vccDataService.queryUserVccStatus(namespace, phoneNo);
if (vccUserEntity == null) {
return JsonResult.serverFailed("该用户不存在!");
}
return JsonResult.success(queryVccUser);
return JsonResult.success(vccUserEntity);
}
@GetMapping("/checkData")
public JsonResult checkUserData(String namespace, String phoneNo, String idCardNo) {
QueryVccUser queryVccUser = vccDataService.queryUserVccStatus(namespace, phoneNo);
if (queryVccUser == null) {
VccUserEntity vccUserEntity = vccDataService.queryUserVccStatus(namespace, phoneNo);
if (vccUserEntity == null) {
return JsonResult.serverFailed("该用户不存在!");
}
Map<String, Object> map = new HashMap<>();
map.put("phoneNo", queryVccUser.getPhoneNo());
map.put("userId", queryVccUser.getUserId());
map.put("uuid", queryVccUser.getUuid());
map.put("registeredFrom", queryVccUser.getRegisteredFrom());
map.put("nextApplyTime", queryVccUser.getNextApplyTime());
map.put("createdAt", queryVccUser.getCreatedAt());
map.put("status", VccStatusEnum.getDescByCode(queryVccUser.getStatus()));
map.put("phoneNo", vccUserEntity.getPhoneNo());
map.put("userId", vccUserEntity.getUserId());
map.put("uuid", vccUserEntity.getUuid());
map.put("registeredFrom", vccUserEntity.getRegisteredFrom());
map.put("nextApplyTime", vccUserEntity.getNextApplyTime());
map.put("createdAt", vccUserEntity.getCreatedAt());
map.put("status", VccStatusEnum.getDescByCode(vccUserEntity.getStatus()));
return JsonResult.success(map);
}
}
package cn.qg.qaplatform.zdata.controller;
package cn.qg.qaplatform.zdata.controller.xyqb;
import cn.qg.qaplatform.common.JsonResult;
import cn.qg.qaplatform.utils.JsonResult;
import cn.qg.qaplatform.zdata.enums.ChannelEnum;
import cn.qg.qaplatform.zdata.enums.FundEnum;
import cn.qg.qaplatform.zdata.domain.ApplyDataVo;
import cn.qg.qaplatform.zdata.domain.GenLoanUser;
import cn.qg.qaplatform.zdata.service.LexinDataService;
import cn.qg.qaplatform.zdata.service.XyqbDataService;
import cn.qg.qaplatform.zdata.service.QueryBasicLoanStatusDataService;
import cn.qg.qaplatform.zdata.entity.XyqbApplyDataVo;
import cn.qg.qaplatform.zdata.entity.XjfqGenProcessVo;
import cn.qg.qaplatform.zdata.service.xyqb.LexinDataService;
import cn.qg.qaplatform.zdata.service.xyqb.XyqbGenDataService;
import cn.qg.qaplatform.zdata.service.xyqb.XyqbBasicQueryService;
import cn.qg.qaplatform.utils.EnumUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -21,29 +21,29 @@ import java.util.Map;
@RestController
@CrossOrigin
@RequestMapping("/gen")
@RequestMapping("/xyqb/gen")
@Api(tags = "造数据相关接口")
public class GenLoanUserDataController {
public class XyqbGenController {
@Autowired
XyqbDataService xyqbDataService;
XyqbGenDataService xyqbGenDataService;
@Autowired
LexinDataService lexinDataService;
@Autowired
QueryBasicLoanStatusDataService queryBasicLoanStatusDataService;
XyqbBasicQueryService xyqbBasicQueryService;
@ApiOperation(value = "造数据接口")
@PostMapping("/data")
public JsonResult genLoanUserData(@RequestBody ApplyDataVo applyDataVo) throws Exception {
public JsonResult genLoanUserData(@RequestBody XyqbApplyDataVo xyqbApplyDataVo) throws Exception {
boolean result = false;
if (applyDataVo.getChannel().equals(ChannelEnum.XYQB.getChannelId())) {
result = xyqbDataService.genLoanUser(applyDataVo);
}
if (applyDataVo.getChannel().equals(ChannelEnum.LEXIN.getChannelId())) {
result = lexinDataService.genLexinData(applyDataVo);
if (xyqbApplyDataVo.getChannel().equals(ChannelEnum.XYQB.getChannelId())) {
result = xyqbGenDataService.genLoanUser(xyqbApplyDataVo);
}
// if (xyqbApplyDataVo.getChannel().equals(ChannelEnum.LEXIN.getChannelId())) {
// result = lexinDataService.genLexinData(xyqbApplyDataVo);
// }
return JsonResult.success(result);
}
......@@ -62,8 +62,8 @@ public class GenLoanUserDataController {
@GetMapping("/userStatus")
public JsonResult queryUserStatus(@RequestParam String namespace,
@RequestParam String phoneNo) {
GenLoanUser genLoanUser = xyqbDataService.queryUserStatus(namespace, phoneNo);
return JsonResult.success(genLoanUser);
XjfqGenProcessVo xjfqGenProcessVo = xyqbGenDataService.queryUserStatus(namespace, phoneNo);
return JsonResult.success(xjfqGenProcessVo);
}
@GetMapping("/channelMappedFund")
......
package cn.qg.qaplatform.zdata.controller;
package cn.qg.qaplatform.zdata.controller.xyqb;
import cn.qg.qaplatform.zdata.service.QueryLoanUserDataService;
import cn.qg.qaplatform.common.JsonResult;
import cn.qg.qaplatform.zdata.service.QueryBasicLoanStatusDataService;
import cn.qg.qaplatform.zdata.service.xyqb.XyqbQueryService;
import cn.qg.qaplatform.utils.JsonResult;
import cn.qg.qaplatform.zdata.service.xyqb.XyqbBasicQueryService;
import cn.qg.qaplatform.utils.page.PageResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......@@ -16,15 +16,15 @@ import java.util.Map;
@CrossOrigin
@RestController
@RequestMapping("query")
@RequestMapping("/xyqb/query")
@Api(tags = "捞数据相关接口")
public class QueryLoanUserDataController {
public class XyqbQueryController {
@Autowired
private QueryBasicLoanStatusDataService basicLoanStatusDataService;
private XyqbBasicQueryService basicLoanStatusDataService;
@Autowired
private QueryLoanUserDataService loanUserDataService;
private XyqbQueryService loanUserDataService;
/**
* @return 获取所有借款用户状态
......
package cn.qg.qaplatform.zdata.domain;
package cn.qg.qaplatform.zdata.entity;
import lombok.Data;
/**
* vcc造数据结果页信息
*/
@Data
public class GenVccUser {
public class VccOpenResultVo {
/**
* 手机号
*/
......
package cn.qg.qaplatform.zdata.domain;
package cn.qg.qaplatform.zdata.entity;
import lombok.Data;
......@@ -8,27 +8,27 @@ import java.util.Date;
* 捞数据返回的享花卡用户实体类
*/
@Data
public class QueryVccUser {
public String phoneNo;
public class VccUserEntity {
private String phoneNo;
public String userId;
private String userId;
public String uuid;
private String uuid;
/**
* 注册渠道
*/
public Long registeredFrom;
private Long registeredFrom;
/**
* 过期时间
*/
public Date nextApplyTime;
private Date nextApplyTime;
/**
* 创建时间
*/
public Date createdAt;
private Date createdAt;
/**
* CREATED("初始状态"), // 0
......@@ -40,5 +40,10 @@ public class QueryVccUser {
* XYQB_OPEN_SUCC("信用钱包开户成功"), // 6
* XYQB_OPEN_FAILED("信用钱包开户失败"), // 7
*/
public Integer status;
private Integer status;
/**
* 账号类别:vcc/scacard/xyqb_mall'
*/
private String type;
}
package cn.qg.qaplatform.zdata.domain;
package cn.qg.qaplatform.zdata.entity;
import lombok.Data;
import java.util.Date;
/**
* 现金分期造数据过程中
*/
@Data
public class GenLoanUser {
public class XjfqGenProcessVo {
/**
* 手机号
*/
......
package cn.qg.qaplatform.zdata.domain;
package cn.qg.qaplatform.zdata.entity;
import lombok.Data;
import java.util.Date;
......@@ -7,7 +7,7 @@ import java.util.Date;
* 捞数据返回的用户实体类
*/
@Data
public class QueryLoanUser {
public class XjfqUserEntity {
/**
* 手机号
*/
......
package cn.qg.qaplatform.zdata.domain;
package cn.qg.qaplatform.zdata.entity;
import lombok.Data;
......@@ -8,7 +8,7 @@ import javax.validation.constraints.NotNull;
* 造数据传递的参数实体类
*/
@Data
public class ApplyDataVo {
public class XyqbApplyDataVo {
@NotNull(message = "借款状态不能为空!")
private Integer status;
......
......@@ -5,8 +5,8 @@ package cn.qg.qaplatform.zdata.enums;
*/
public enum ChannelEnum {
XYQB("信用钱包", 1),
LEXIN("乐信", 159886);
XYQB("信用钱包", 1);
// LEXIN("乐信", 159886);
private String name;
private Integer channelId;
......
......@@ -7,8 +7,8 @@ public enum FundEnum {
GYXD("广达小贷", 480),
YNXT("云南信托", 1040),
PDSB("平顶山银行", 1030),
GDLX("广达乐信",1010);
PDSB("平顶山银行", 1030);
// GDLX("广达乐信",1010);
private String name;
private Integer fundId;
......
package cn.qg.qaplatform.zdata.mapper;
import cn.qg.qaplatform.zdata.domain.QueryVccUser;
import cn.qg.qaplatform.zdata.entity.VccUserEntity;
import java.util.List;
public interface QueryVccDataMapper {
public interface VccDataMapper {
/**
* 根据状态获取vcc用户
*/
List<QueryVccUser> queryVccDataByStatus(Integer status);
List<VccUserEntity> queryVccDataByStatus(Integer status);
/**
* 查看用户vcc状态
*/
QueryVccUser queryUserVccStatus(String phoneNo);
VccUserEntity queryUserVccStatus(String phoneNo);
}
package cn.qg.qaplatform.zdata.mapper;
import cn.qg.qaplatform.zdata.domain.GenLoanUser;
import cn.qg.qaplatform.zdata.domain.QueryLoanUser;
import cn.qg.qaplatform.zdata.entity.XjfqGenProcessVo;
import cn.qg.qaplatform.zdata.entity.XjfqUserEntity;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface QueryBasicLoanStatusDataMapper {
public interface XyqbLoanDataMapper {
/**
* 根据uuidList获取用户数据信息
* @param uuidList
* @return
*/
List<QueryLoanUser> getUserDataListByUuidList(List<String> uuidList);
List<XjfqUserEntity> getUserDataListByUuidList(List<String> uuidList);
/**
* 获取未申请用户数据uuidList
......@@ -32,7 +32,7 @@ public interface QueryBasicLoanStatusDataMapper {
* @param userIdList
* @return
*/
List<QueryLoanUser> getUserDataListByUserIdList(List<String> userIdList);
List<XjfqUserEntity> getUserDataListByUserIdList(List<String> userIdList);
/**
* 根据审核状态获取用户Id列表
......@@ -69,7 +69,7 @@ public interface QueryBasicLoanStatusDataMapper {
*/
Integer getAssignFundIdByUserId(String userId);
GenLoanUser getUserInfoByPhoneNo(String phoneNo);
XjfqGenProcessVo getUserInfoByPhoneNo(String phoneNo);
Integer getLoanProgressByUserId(String userId);
}
......@@ -2,7 +2,7 @@ package cn.qg.qaplatform.zdata.process;
import cn.qg.qaplatform.config.WebSocketServer;
import cn.qg.qaplatform.utils.DBUtils;
import cn.qg.qaplatform.utils.Encrypt.LexinEncrypt;
import cn.qg.qaplatform.zdata.Encrypt.LexinEncrypt;
import cn.qg.qaplatform.utils.HttpClientUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
......
package cn.qg.qaplatform.zdata.process;
import cn.qg.qaplatform.config.WebSocketServer;
import cn.qg.qaplatform.zdata.domain.ApplyDataVo;
import cn.qg.qaplatform.utils.Encrypt.LexinEncrypt;
import cn.qg.qaplatform.zdata.entity.XyqbApplyDataVo;
import cn.qg.qaplatform.zdata.Encrypt.LexinEncrypt;
import cn.qg.qaplatform.utils.HttpClientUtils;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
......@@ -24,17 +24,17 @@ public class Lexin {
/**
* 进件
*/
public static boolean createOrder(ApplyDataVo applyDataVo) {
String namespace = applyDataVo.getNamespace();
String phoneNo = applyDataVo.getPhoneNo();
String userName = applyDataVo.getName();
String idCardNo = applyDataVo.getIdCardNo();
Integer amount = applyDataVo.getAmount();
Integer term = applyDataVo.getTerm();
String rate = applyDataVo.getRate();
String fixedBillDay = applyDataVo.getFixedBillDay();
String fixedRepayDay = applyDataVo.getFixedRepayDay();
String symbol = applyDataVo.getSymbol();
public static boolean createOrder(XyqbApplyDataVo xyqbApplyDataVo) {
String namespace = xyqbApplyDataVo.getNamespace();
String phoneNo = xyqbApplyDataVo.getPhoneNo();
String userName = xyqbApplyDataVo.getName();
String idCardNo = xyqbApplyDataVo.getIdCardNo();
Integer amount = xyqbApplyDataVo.getAmount();
Integer term = xyqbApplyDataVo.getTerm();
String rate = xyqbApplyDataVo.getRate();
String fixedBillDay = xyqbApplyDataVo.getFixedBillDay();
String fixedRepayDay = xyqbApplyDataVo.getFixedRepayDay();
String symbol = xyqbApplyDataVo.getSymbol();
String orderNo = "channel_order" + phoneNo + "_" + random.nextInt(9999);
String url = "http://qapi-" + namespace + ".liangkebang.net/ex/api/v2/applyLoan/LEXIN";
......
......@@ -194,7 +194,7 @@ public class Vcc {
/**
* 授信结果查询
*/
public static void searchCreditResult(String namespace, String token, String vccChannel) throws URISyntaxException {
public static Map<String, Object> searchCreditResult(String namespace, String token, String vccChannel) throws URISyntaxException {
String url = "https://talos-" + namespace + ".liangkebang.net/vcc/xyqb_mall/credit_info";
Map<String, Object> headers = new HashMap<>();
headers.put("x-auth-token", token);
......@@ -202,6 +202,8 @@ public class Vcc {
headers.put("content-type", "application/x-www-form-urlencoded");
JSONObject result = HttpClientUtils.doGetReturnJson(url, null, headers);
log.info("授信结果查询:" + result);
Map<String, Object> map = (Map<String, Object>) result.get("data");
return map;
}
/**
......@@ -217,15 +219,15 @@ public class Vcc {
/**
* vcc风控授信回调
*/
public static void vccWindControlCreditCallback(String namespace, String uuid, String riskNo) {
public static void vccWindControlCreditCallback(String namespace, String uuid, String riskNo, boolean auditResult) {
String url = "https://talos-" + namespace + ".liangkebang.net/ex/vcc/risk/auth_amount_completion";
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 15);
long openingDeadLine = calendar.getTimeInMillis();
Map<String, Object> params = new HashMap<>();
params.put("amount", 10000);
params.put("auditResult", true);
params.put("bizChannel", 1);
params.put("auditResult", auditResult);
params.put("bizChannel", 159904);
params.put("bizNo", riskNo);
params.put("code", 0);
params.put("deadLine", "1640966399000");
......@@ -345,7 +347,10 @@ public class Vcc {
return true;
}
public static void main(String[] args) throws SQLException {
vccWindControlCreditCallback("vc2", "1", "");
public static void main(String[] args) throws Exception {
Map<String, String> loginResult = login("vcc3", "18300000418", "214", "214");
String uuid = loginResult.get("uuid");
String riskNo = getRiskNo("vcc3", uuid);
vccWindControlCreditCallback("vcc3", "1", riskNo, true);
}
}
package cn.qg.qaplatform.zdata.service;
package cn.qg.qaplatform.zdata.service.risk;
/**
* 风控相关接口
* 风控相关服务
*/
public interface RuleEngineService {
/**
......
package cn.qg.qaplatform.zdata.service.impl;
package cn.qg.qaplatform.zdata.service.risk.impl;
import cn.qg.qaplatform.common.SwitchDataSource;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.zdata.mapper.RuleEngineMapper;
import cn.qg.qaplatform.zdata.service.RuleEngineService;
import cn.qg.qaplatform.zdata.service.risk.RuleEngineService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 风控相关服务
*/
@Service
public class RuleEngineServiceImpl implements RuleEngineService {
@Autowired
RuleEngineMapper ruleEngineMapper;
/**
* 添加授信黑名单
* @param uuid uuid
* @return 成功与否
*/
@Override
public boolean addBlackList(String uuid) {
SwitchDataSource.dataSourceSwitch("fe", "workflow");
......
package cn.qg.qaplatform.zdata.service;
package cn.qg.qaplatform.zdata.service.vcc;
import cn.qg.qaplatform.zdata.domain.GenVccUser;
import cn.qg.qaplatform.zdata.domain.QueryVccUser;
import cn.qg.qaplatform.zdata.entity.VccOpenResultVo;
import cn.qg.qaplatform.zdata.entity.VccUserEntity;
import cn.qg.qaplatform.utils.page.PageResult;
......@@ -10,9 +10,18 @@ import cn.qg.qaplatform.utils.page.PageResult;
* @author libo
*/
public interface VccDataService {
GenVccUser makeVccUser(String namespace, String phoneNo, String openedChannel, Integer status) throws Exception;
/**
* vcc造数据
*/
VccOpenResultVo makeVccUser(String namespace, String phoneNo, String openedChannel, Integer status) throws Exception;
/**
* 根据状态批量获取vcc数据
*/
PageResult getVccData(String namespace, Integer status, Integer pageNum, Integer pageSize);
QueryVccUser queryUserVccStatus(String namespace, String phoneNo);
/**
* 根据手机号获取用户vcc状态
*/
VccUserEntity queryUserVccStatus(String namespace, String phoneNo);
}
package cn.qg.qaplatform.zdata.service.impl;
package cn.qg.qaplatform.zdata.service.vcc.impl;
import cn.qg.qaplatform.common.SwitchDataSource;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.zdata.enums.VccStatusEnum;
import cn.qg.qaplatform.zdata.mapper.QueryVccDataMapper;
import cn.qg.qaplatform.zdata.domain.GenVccUser;
import cn.qg.qaplatform.zdata.domain.QueryVccUser;
import cn.qg.qaplatform.zdata.mapper.VccDataMapper;
import cn.qg.qaplatform.zdata.entity.VccOpenResultVo;
import cn.qg.qaplatform.zdata.entity.VccUserEntity;
import cn.qg.qaplatform.zdata.process.Vcc;
import cn.qg.qaplatform.zdata.service.RuleEngineService;
import cn.qg.qaplatform.zdata.service.VccDataService;
import cn.qg.qaplatform.zdata.service.risk.RuleEngineService;
import cn.qg.qaplatform.zdata.service.vcc.VccDataService;
import cn.qg.qaplatform.utils.page.PageResult;
import cn.qg.qaplatform.utils.page.PageUtil;
import com.alibaba.fastjson.JSONObject;
......@@ -26,7 +26,7 @@ import java.util.Map;
public class VccDataServiceImpl implements VccDataService {
@Autowired
QueryVccDataMapper queryVccDataMapper;
VccDataMapper vccDataMapper;
@Autowired
RuleEngineService ruleEngineService;
......@@ -41,10 +41,10 @@ public class VccDataServiceImpl implements VccDataService {
* @throws Exception
*/
@Override
public GenVccUser makeVccUser(String namespace, String phoneNo, String openedChannel, Integer status) throws Exception {
GenVccUser genVccUser = new GenVccUser();
genVccUser.setPhoneNo(phoneNo);
genVccUser.setOpenedChannel(openedChannel);
public VccOpenResultVo makeVccUser(String namespace, String phoneNo, String openedChannel, Integer status) throws Exception {
VccOpenResultVo vccOpenResultVo = new VccOpenResultVo();
vccOpenResultVo.setPhoneNo(phoneNo);
vccOpenResultVo.setOpenedChannel(openedChannel);
String vccChannel = null;
if (openedChannel.equals("214")) {
vccChannel = "159904";
......@@ -67,8 +67,8 @@ public class VccDataServiceImpl implements VccDataService {
// 检查用户是否已有额度
boolean haveQuota = Vcc.checkIfAlreadyHaveQuota(namespace, uuid);
if (haveQuota) {
genVccUser.setMsg("该用户已申请过,请更换新用户申请!");
return genVccUser;
vccOpenResultVo.setMsg("该用户已申请过,请更换新用户申请!");
return vccOpenResultVo;
}
// credit url
String vccToken = Vcc.creditUrl(namespace, token, vccChannel);
......@@ -85,13 +85,33 @@ public class VccDataServiceImpl implements VccDataService {
// 提交授信
Vcc.submitCredit(namespace, token, vccChannel);
// 授信结果查询
Vcc.searchCreditResult(namespace, token, vccChannel);
int searchCreditCount = 0;
while (true) {
try {
Thread.sleep(1000);
searchCreditCount++;
Map<String, Object> creditResult = Vcc.searchCreditResult(namespace, token, vccChannel);
if (creditResult.get("status").equals("1") || creditResult.get("status").equals("2")) {
break;
} else if (creditResult.get("status").equals("0") && searchCreditCount == 10) {
String riskNo = Vcc.getRiskNo(namespace, uuid);
if (status == 2) {
Vcc.vccWindControlCreditCallback(namespace, uuid, riskNo, false);
} else {
Vcc.vccWindControlCreditCallback(namespace, uuid, riskNo, true);
}
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (status == 1 || status == 2) {
log.info("提交授信成功!");
Thread.sleep(2000);
QueryVccUser userInfo = queryUserVccStatus(namespace, phoneNo);
genVccUser.setMsg(VccStatusEnum.getDescByCode(userInfo.getStatus()));
return genVccUser;
VccUserEntity userInfo = queryUserVccStatus(namespace, phoneNo);
vccOpenResultVo.setMsg(VccStatusEnum.getDescByCode(userInfo.getStatus()));
return vccOpenResultVo;
}
// 人脸识别回调
Vcc.appFaceCallback(namespace, token, vccChannel);
......@@ -107,19 +127,19 @@ public class VccDataServiceImpl implements VccDataService {
Map data = (Map) result.get("data");
String amount = data.get("amount").toString();
String eacctNo = data.get("eacctNo").toString();
genVccUser.setAmount(amount);
genVccUser.setEacctNo(eacctNo);
genVccUser.setMsg("开户成功");
vccOpenResultVo.setAmount(amount);
vccOpenResultVo.setEacctNo(eacctNo);
vccOpenResultVo.setMsg("开户成功");
}
if (status == 4) {
Map data = (Map) quotaActivationResult.get("data");
if (data.get("status").equals("2")) {
genVccUser.setMsg("开户失败");
vccOpenResultVo.setMsg("开户失败");
} else {
genVccUser.setMsg("请找开发手动设置结果为开户失败!");
vccOpenResultVo.setMsg("请找开发手动设置结果为开户失败!");
}
}
return genVccUser;
return vccOpenResultVo;
}
/**
......@@ -132,8 +152,8 @@ public class VccDataServiceImpl implements VccDataService {
public PageResult getVccData(String namespace, Integer status, Integer pageNum, Integer pageSize) {
SwitchDataSource.dataSourceSwitch(namespace, "vcc_talos");
PageHelper.startPage(pageNum, pageSize);
List<QueryVccUser> result = queryVccDataMapper.queryVccDataByStatus(status);
PageInfo<QueryVccUser> pageList = new PageInfo<>(result);
List<VccUserEntity> result = vccDataMapper.queryVccDataByStatus(status);
PageInfo<VccUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......@@ -145,8 +165,8 @@ public class VccDataServiceImpl implements VccDataService {
* @return QueryVccUser实体
*/
@Override
public QueryVccUser queryUserVccStatus(String namespace, String phoneNo) {
public VccUserEntity queryUserVccStatus(String namespace, String phoneNo) {
SwitchDataSource.dataSourceSwitch(namespace, "vcc_talos");
return queryVccDataMapper.queryUserVccStatus(phoneNo);
return vccDataMapper.queryUserVccStatus(phoneNo);
}
}
package cn.qg.qaplatform.zdata.service;
package cn.qg.qaplatform.zdata.service.xyqb;
import cn.qg.qaplatform.zdata.domain.ApplyDataVo;
import cn.qg.qaplatform.zdata.entity.XyqbApplyDataVo;
/**
* 乐信数据
......@@ -8,5 +8,5 @@ import cn.qg.qaplatform.zdata.domain.ApplyDataVo;
*/
public interface LexinDataService {
boolean genLexinData(ApplyDataVo applyDataVo) throws Exception;
boolean genLexinData(XyqbApplyDataVo xyqbApplyDataVo) throws Exception;
}
package cn.qg.qaplatform.zdata.service;
package cn.qg.qaplatform.zdata.service.xyqb;
/**
* 查询造数据流程中的状态
......
package cn.qg.qaplatform.zdata.service;
package cn.qg.qaplatform.zdata.service.xyqb;
import cn.qg.qaplatform.zdata.domain.GenLoanUser;
import cn.qg.qaplatform.zdata.domain.QueryLoanUser;
import cn.qg.qaplatform.zdata.entity.XjfqGenProcessVo;
import cn.qg.qaplatform.zdata.entity.XjfqUserEntity;
import java.util.List;
import java.util.Map;
......@@ -9,7 +9,7 @@ import java.util.Map;
/**
* 单个状态数据查询
*/
public interface QueryBasicLoanStatusDataService {
public interface XyqbBasicQueryService {
/**
* 获取所有的用户状态
*/
......@@ -23,7 +23,7 @@ public interface QueryBasicLoanStatusDataService {
/**
* 根据uuid获取用户信息
*/
List<QueryLoanUser> getUserDataListByUuidList(String namespace, List<String> uuidList);
List<XjfqUserEntity> getUserDataListByUuidList(String namespace, List<String> uuidList);
/**
* 获取未申请用户
......@@ -49,7 +49,7 @@ public interface QueryBasicLoanStatusDataService {
/**
* 根据userIdList获取用户信息列表
*/
List<QueryLoanUser> getUserDataListByUserIdList(String namespace, List<String> userIdList);
List<XjfqUserEntity> getUserDataListByUserIdList(String namespace, List<String> userIdList);
/**
* 获取不同放款状态的用户
......@@ -69,7 +69,7 @@ public interface QueryBasicLoanStatusDataService {
/**
* 根据手机号查询用户信息
*/
GenLoanUser getUserInfoByPhoneNo(String namespace, String phoneNo);
XjfqGenProcessVo getUserInfoByPhoneNo(String namespace, String phoneNo);
/**
* 根据userId获取用户放款状态
......
package cn.qg.qaplatform.zdata.service;
package cn.qg.qaplatform.zdata.service.xyqb;
import cn.qg.qaplatform.zdata.domain.ApplyDataVo;
import cn.qg.qaplatform.zdata.domain.GenLoanUser;
import cn.qg.qaplatform.zdata.entity.XyqbApplyDataVo;
import cn.qg.qaplatform.zdata.entity.XjfqGenProcessVo;
import java.io.IOException;
public interface XyqbDataService {
public interface XyqbGenDataService {
/**
* 分配资金方
......@@ -14,32 +14,32 @@ public interface XyqbDataService {
/**
* 授信
* @param applyDataVo 造数据的相关信息
* @param xyqbApplyDataVo 造数据的相关信息
* @return 成功或失败
*/
boolean quotaAuth(ApplyDataVo applyDataVo, boolean auditResult) throws Exception;
boolean quotaAuth(XyqbApplyDataVo xyqbApplyDataVo, boolean auditResult) throws Exception;
/**
* 提现
* @param applyDataVo 造数据相关信息
* @param xyqbApplyDataVo 造数据相关信息
* @return 成功或失败
*/
boolean withDraw(ApplyDataVo applyDataVo, boolean auditResult) throws Exception;
boolean withDraw(XyqbApplyDataVo xyqbApplyDataVo, boolean auditResult) throws Exception;
/**
* 放款
* @param applyDataVo
* @param xyqbApplyDataVo
* @return
*/
boolean makeLoan(ApplyDataVo applyDataVo, boolean payStatus) throws Exception;
boolean makeLoan(XyqbApplyDataVo xyqbApplyDataVo, boolean payStatus) throws Exception;
/**
* 造数据
* @param applyDataVo
* @param xyqbApplyDataVo
* @return
* @throws Exception
*/
boolean genLoanUser(ApplyDataVo applyDataVo) throws Exception;
boolean genLoanUser(XyqbApplyDataVo xyqbApplyDataVo) throws Exception;
/**
* 获取用户状态
......@@ -47,6 +47,6 @@ public interface XyqbDataService {
* @param phoneNo
* @return
*/
GenLoanUser queryUserStatus(String namespace, String phoneNo);
XjfqGenProcessVo queryUserStatus(String namespace, String phoneNo);
}
package cn.qg.qaplatform.zdata.service;
package cn.qg.qaplatform.zdata.service.xyqb;
import cn.qg.qaplatform.utils.page.PageResult;
/**
* 多个状态结合查询
*/
public interface QueryLoanUserDataService {
public interface XyqbQueryService {
/**
* 获取已有用户状态数据
* @param status 用户状态
......
package cn.qg.qaplatform.zdata.service.impl;
package cn.qg.qaplatform.zdata.service.xyqb.impl;
import cn.qg.qaplatform.zdata.enums.ChannelEnum;
import cn.qg.qaplatform.zdata.domain.ApplyDataVo;
import cn.qg.qaplatform.zdata.entity.XyqbApplyDataVo;
import cn.qg.qaplatform.zdata.process.Common;
import cn.qg.qaplatform.zdata.process.Lexin;
import cn.qg.qaplatform.zdata.process.Xyqb;
import cn.qg.qaplatform.zdata.service.QueryInProcessStatusService;
import cn.qg.qaplatform.zdata.service.LexinDataService;
import cn.qg.qaplatform.zdata.service.xyqb.QueryInProcessStatusService;
import cn.qg.qaplatform.zdata.service.xyqb.LexinDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
......@@ -24,22 +24,22 @@ public class LexinDataServiceImpl implements LexinDataService {
RedisTemplate redisTemplate;
@Override
public boolean genLexinData(ApplyDataVo applyDataVo) throws Exception {
String namespace = applyDataVo.getNamespace();
String phoneNo = applyDataVo.getPhoneNo();
String bankCardNo = applyDataVo.getBankCardNo();
String bankCode = applyDataVo.getBankCode();
String bankName = applyDataVo.getBankName();
Integer fundId = applyDataVo.getFundId();
String symbol = applyDataVo.getSymbol();
Integer amount = applyDataVo.getAmount();
Integer term = applyDataVo.getTerm();
public boolean genLexinData(XyqbApplyDataVo xyqbApplyDataVo) throws Exception {
String namespace = xyqbApplyDataVo.getNamespace();
String phoneNo = xyqbApplyDataVo.getPhoneNo();
String bankCardNo = xyqbApplyDataVo.getBankCardNo();
String bankCode = xyqbApplyDataVo.getBankCode();
String bankName = xyqbApplyDataVo.getBankName();
Integer fundId = xyqbApplyDataVo.getFundId();
String symbol = xyqbApplyDataVo.getSymbol();
Integer amount = xyqbApplyDataVo.getAmount();
Integer term = xyqbApplyDataVo.getTerm();
Xyqb.symbol = symbol;
Common.symbol = symbol;
// 分配资产计划
boolean fundAssignResult = Common.assignFundCorp(namespace, fundId);
// 进件
boolean createOrderResult = Lexin.createOrder(applyDataVo);
boolean createOrderResult = Lexin.createOrder(xyqbApplyDataVo);
if (!createOrderResult) {
return false;
}
......@@ -47,7 +47,8 @@ public class LexinDataServiceImpl implements LexinDataService {
Map userInfoResult = Xyqb.checkUserId(namespace, phoneNo);
String uuid = userInfoResult.get("uuid").toString();
String userId = userInfoResult.get("id").toString();
String channelOrderNo = Common.queryChannelOrderNoByPhone(namespace, phoneNo, ChannelEnum.LEXIN.getChannelId());
// String channelOrderNo = Common.queryChannelOrderNoByPhone(namespace, phoneNo, ChannelEnum.LEXIN.getChannelId());
String channelOrderNo = Common.queryChannelOrderNoByPhone(namespace, phoneNo, 159886);
Common.channelOrderApprove(namespace, channelOrderNo, amount, "0", true, term);
// 风控授信回调
// Xyqb.creditAuthNotify(namespace, token, uuid, ChannelEnum.LEXIN.getChannelId(), fundId, channelOrderNo, 0, true, amount, term);
......@@ -61,7 +62,8 @@ public class LexinDataServiceImpl implements LexinDataService {
}
setUserStatusRedisValue(namespace, phoneNo, 2);
// 二次风控
Integer loanId = Common.queryLoanId(namespace, phoneNo, ChannelEnum.LEXIN.getChannelId());
// Integer loanId = Common.queryLoanId(namespace, phoneNo, ChannelEnum.LEXIN.getChannelId());
Integer loanId = Common.queryLoanId(namespace, phoneNo, 159886);
boolean secondWindControlResult = Xyqb.externalQuotaOrderAuditNotify(namespace, 1, token, uuid, loanId, 11, true);
Xyqb.modifyContactStatus(namespace, userId);
......
package cn.qg.qaplatform.zdata.service.impl;
package cn.qg.qaplatform.zdata.service.xyqb.impl;
import cn.qg.qaplatform.config.WebSocketServer;
import cn.qg.qaplatform.zdata.service.QueryBasicLoanStatusDataService;
import cn.qg.qaplatform.zdata.service.QueryInProcessStatusService;
import cn.qg.qaplatform.zdata.service.xyqb.XyqbBasicQueryService;
import cn.qg.qaplatform.zdata.service.xyqb.QueryInProcessStatusService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -13,13 +13,13 @@ import org.springframework.stereotype.Service;
public class QueryInProcessStatusServiceImpl implements QueryInProcessStatusService {
@Autowired
QueryBasicLoanStatusDataService queryBasicLoanStatusDataService;
XyqbBasicQueryService xyqbBasicQueryService;
@Override
public void queryFundingAssignProgress(String namespace, String phoneNo, Integer fundId, String symbol) throws InterruptedException {
String userId = queryBasicLoanStatusDataService.getUserInfoByPhoneNo(namespace, phoneNo).getUserId();
String userId = xyqbBasicQueryService.getUserInfoByPhoneNo(namespace, phoneNo).getUserId();
while (true) {
Integer searchResult = queryBasicLoanStatusDataService.getAssignFundIdByUserId(namespace, userId);
Integer searchResult = xyqbBasicQueryService.getAssignFundIdByUserId(namespace, userId);
log.info(searchResult.toString());
if (fundId.equals(searchResult)) {
log.info("用户:" + userId + "资方分配成功!");
......@@ -38,9 +38,9 @@ public class QueryInProcessStatusServiceImpl implements QueryInProcessStatusServ
@Override
public void queryLoanProgress(String namespace, String phoneNo, String symbol) throws InterruptedException {
String userId = queryBasicLoanStatusDataService.getUserInfoByPhoneNo(namespace, phoneNo).getUserId();
String userId = xyqbBasicQueryService.getUserInfoByPhoneNo(namespace, phoneNo).getUserId();
while (true) {
Integer progress = queryBasicLoanStatusDataService.getLoanProgressByUserId(namespace, userId);
Integer progress = xyqbBasicQueryService.getLoanProgressByUserId(namespace, userId);
if (progress == 15) {
log.info("用户:" + userId + "放款成功!");
if (!StringUtils.isEmpty(symbol)) {
......
package cn.qg.qaplatform.zdata.service.impl;
package cn.qg.qaplatform.zdata.service.xyqb.impl;
import cn.qg.qaplatform.zdata.enums.LoanStatus;
import cn.qg.qaplatform.common.enums.Namespace;
import cn.qg.qaplatform.zdata.mapper.QueryBasicLoanStatusDataMapper;
import cn.qg.qaplatform.zdata.domain.GenLoanUser;
import cn.qg.qaplatform.zdata.domain.QueryLoanUser;
import cn.qg.qaplatform.common.SwitchDataSource;
import cn.qg.qaplatform.zdata.service.QueryBasicLoanStatusDataService;
import cn.qg.qaplatform.enums.Namespace;
import cn.qg.qaplatform.zdata.mapper.XyqbLoanDataMapper;
import cn.qg.qaplatform.zdata.entity.XjfqGenProcessVo;
import cn.qg.qaplatform.zdata.entity.XjfqUserEntity;
import cn.qg.qaplatform.config.SwitchDataSource;
import cn.qg.qaplatform.zdata.service.xyqb.XyqbBasicQueryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -16,10 +16,10 @@ import java.util.List;
import java.util.Map;
@Service
public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatusDataService {
public class XyqbBasicQueryServiceImpl implements XyqbBasicQueryService {
@Autowired
QueryBasicLoanStatusDataMapper basicLoanStatusDataMapper;
XyqbLoanDataMapper xyqbLoanDataMapper;
/**
* 获取所有用户状态
......@@ -59,9 +59,9 @@ public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatus
* @return
*/
@Override
public List<QueryLoanUser> getUserDataListByUuidList(String namespace, List<String> uuidList) {
public List<XjfqUserEntity> getUserDataListByUuidList(String namespace, List<String> uuidList) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb_user");
return basicLoanStatusDataMapper.getUserDataListByUuidList(uuidList);
return xyqbLoanDataMapper.getUserDataListByUuidList(uuidList);
}
/**
......@@ -71,7 +71,7 @@ public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatus
@Override
public List<String> getUnApplyUserUuidList(String namespace, Integer channel) {
SwitchDataSource.dataSourceSwitch(namespace, "business_flow");
return basicLoanStatusDataMapper.getUnApplyLoanUserUuidList(channel);
return xyqbLoanDataMapper.getUnApplyLoanUserUuidList(channel);
}
/**
......@@ -82,7 +82,7 @@ public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatus
@Override
public boolean queryIfPhoneExist(String namespace, String phone) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb_user");
if (basicLoanStatusDataMapper.queryIfPhoneExist(phone) != null) {
if (xyqbLoanDataMapper.queryIfPhoneExist(phone) != null) {
return true;
}
return false;
......@@ -98,13 +98,13 @@ public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatus
public List<String> getAuditStatusUserIdList(String namespace, Integer status, Integer channel) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb");
if (status == 0) {
return basicLoanStatusDataMapper.getAuditStatusUserIdList(0, channel);
return xyqbLoanDataMapper.getAuditStatusUserIdList(0, channel);
}
if (status == 1) {
return basicLoanStatusDataMapper.getAuditStatusUserIdList(1, channel);
return xyqbLoanDataMapper.getAuditStatusUserIdList(1, channel);
}
if (status == 2) {
return basicLoanStatusDataMapper.getAuditStatusUserIdList(2, channel);
return xyqbLoanDataMapper.getAuditStatusUserIdList(2, channel);
}
return null;
}
......@@ -119,7 +119,7 @@ public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatus
@Override
public List<String> queryAuthAndUnWithdraw(String namespace, Integer channel, Integer fundId) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb");
List<String> userIdList = basicLoanStatusDataMapper.queryAuthAndUnWithdraw(channel, fundId);
List<String> userIdList = xyqbLoanDataMapper.queryAuthAndUnWithdraw(channel, fundId);
return userIdList;
}
......@@ -130,9 +130,9 @@ public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatus
* @return
*/
@Override
public List<QueryLoanUser> getUserDataListByUserIdList(String namespace, List<String> userIdList) {
public List<XjfqUserEntity> getUserDataListByUserIdList(String namespace, List<String> userIdList) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb_user");
List<QueryLoanUser> result = basicLoanStatusDataMapper.getUserDataListByUserIdList(userIdList);
List<XjfqUserEntity> result = xyqbLoanDataMapper.getUserDataListByUserIdList(userIdList);
return result;
}
......@@ -146,10 +146,10 @@ public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatus
public List<String> getLoanStatusUserIdList(String namespace, Integer status, Integer channel, Integer fundId) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb");
if (status == 0) {
return basicLoanStatusDataMapper.getLoanStatusUserIdList(23, channel, fundId);
return xyqbLoanDataMapper.getLoanStatusUserIdList(23, channel, fundId);
}
if (status == 1) {
return basicLoanStatusDataMapper.getLoanStatusUserIdList(15, channel, fundId);
return xyqbLoanDataMapper.getLoanStatusUserIdList(15, channel, fundId);
}
return null;
}
......@@ -162,24 +162,24 @@ public class QueryBasicLoanStatusDataServiceImpl implements QueryBasicLoanStatus
@Override
public List<String> getMultiOrderUserDataList(String namespace) {
SwitchDataSource.dataSourceSwitch("fe", "workflow");
return basicLoanStatusDataMapper.getMultiOrderuuidList();
return xyqbLoanDataMapper.getMultiOrderuuidList();
}
@Override
public Integer getAssignFundIdByUserId(String namespace, String userId) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb");
return basicLoanStatusDataMapper.getAssignFundIdByUserId(userId);
return xyqbLoanDataMapper.getAssignFundIdByUserId(userId);
}
@Override
public GenLoanUser getUserInfoByPhoneNo(String namespace, String phoneNo) {
public XjfqGenProcessVo getUserInfoByPhoneNo(String namespace, String phoneNo) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb_user");
return basicLoanStatusDataMapper.getUserInfoByPhoneNo(phoneNo);
return xyqbLoanDataMapper.getUserInfoByPhoneNo(phoneNo);
}
@Override
public Integer getLoanProgressByUserId(String namespace, String userId) {
SwitchDataSource.dataSourceSwitch(namespace, "xyqb");
return basicLoanStatusDataMapper.getLoanProgressByUserId(userId);
return xyqbLoanDataMapper.getLoanProgressByUserId(userId);
}
}
package cn.qg.qaplatform.zdata.service.impl;
package cn.qg.qaplatform.zdata.service.xyqb.impl;
import cn.qg.qaplatform.zdata.domain.QueryLoanUser;
import cn.qg.qaplatform.zdata.service.QueryLoanUserDataService;
import cn.qg.qaplatform.zdata.service.QueryBasicLoanStatusDataService;
import cn.qg.qaplatform.zdata.entity.XjfqUserEntity;
import cn.qg.qaplatform.zdata.service.xyqb.XyqbQueryService;
import cn.qg.qaplatform.zdata.service.xyqb.XyqbBasicQueryService;
import cn.qg.qaplatform.utils.page.PageResult;
import cn.qg.qaplatform.utils.page.PageUtil;
import com.github.pagehelper.PageHelper;
......@@ -19,10 +19,10 @@ import java.util.List;
*/
@Service
@Slf4j
public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
public class XyqbQueryServiceImpl implements XyqbQueryService {
@Autowired
private QueryBasicLoanStatusDataService basicLoanStatusDataService;
private XyqbBasicQueryService basicLoanStatusDataService;
/**
* 筛选某个状态的用户(0-注册未申请,1-授信中,2-审核通过,3-审核拒绝,4-审核通过未提现,5-放款成功,6-放款失败,7-多订单)
......@@ -36,7 +36,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
@Override
public PageResult getLoanUserData(String namespace, Integer status, Integer channel, Integer fundId, Integer pageNum, Integer pageSize) {
List<QueryLoanUser> result = new ArrayList<>();
List<XjfqUserEntity> result = new ArrayList<>();
/**
* 0-注册未申请
......@@ -49,7 +49,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
}
PageHelper.startPage(pageNum, pageSize);
result = basicLoanStatusDataService.getUserDataListByUuidList(namespace, uuidList);
PageInfo<QueryLoanUser> pageList = new PageInfo<>(result);
PageInfo<XjfqUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......@@ -65,7 +65,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
}
PageHelper.startPage(pageNum, pageSize);
result = basicLoanStatusDataService.getUserDataListByUserIdList(namespace, userIdList);
PageInfo<QueryLoanUser> pageList = new PageInfo<>(result);
PageInfo<XjfqUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......@@ -86,7 +86,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
} else {
result.forEach((item) -> item.setFundId(fundId));
}
PageInfo<QueryLoanUser> pageList = new PageInfo<>(result);
PageInfo<XjfqUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......@@ -107,7 +107,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
} else {
result.forEach((item) -> item.setFundId(fundId));
}
PageInfo<QueryLoanUser> pageList = new PageInfo<>(result);
PageInfo<XjfqUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......@@ -124,7 +124,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
PageHelper.startPage(pageNum, pageSize);
result = basicLoanStatusDataService.getUserDataListByUserIdList(namespace, userIdList);
result.forEach((item) -> item.setFundId(fundId));
PageInfo<QueryLoanUser> pageList = new PageInfo<>(result);
PageInfo<XjfqUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......@@ -145,7 +145,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
} else {
result.forEach((item) -> item.setFundId(fundId));
}
PageInfo<QueryLoanUser> pageList = new PageInfo<>(result);
PageInfo<XjfqUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......@@ -167,7 +167,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
} else {
result.forEach((item) -> item.setFundId(fundId));
}
PageInfo<QueryLoanUser> pageList = new PageInfo<>(result);
PageInfo<XjfqUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......@@ -183,7 +183,7 @@ public class QueryLoanUserDataServiceImpl implements QueryLoanUserDataService {
}
PageHelper.startPage(pageNum, pageSize);
result = basicLoanStatusDataService.getUserDataListByUuidList(namespace, uuidList);
PageInfo<QueryLoanUser> pageList = new PageInfo<>(result);
PageInfo<XjfqUserEntity> pageList = new PageInfo<>(result);
PageResult pageResult = PageUtil.getPageResult(pageList, pageNum, pageSize);
return pageResult;
}
......
......@@ -6,6 +6,9 @@ spring:
password: qatest
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
break-after-acquire-failure: true # 连接失败后不重试
connection-error-retry-attempts: 1
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
......@@ -19,6 +22,8 @@ spring:
max-active: 8
max-wait: -1
max-idle: 8
application:
name: qa-platform
server:
port: 8082
......@@ -26,7 +31,7 @@ server:
# mybatis-plus 配置
mybatis-plus:
mapper-locations: classpath:mapper/*/*.xml
type-aliases-package: cn.qg.qaplatform.*.domain
type-aliases-package: cn.qg.qaplatform.*.entity
configuration:
map-underscore-to-camel-case: true
......@@ -38,9 +43,9 @@ pagehelper:
params: count=countSql
# 日志配置
logging:
level:
root: info
cn.qg.qaplatform: info
file:
name: /home/quant_group/logs/qa-platform.log
#logging:
# level:
# root: info
# cn.qg.qaplatform: info
# file:
# name: /home/quant_group/logs/qa-platform.log
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 日志配置 -->
<configuration>
<property name="DEV_HOME" value="."/>
<springProperty name="spring.application.name" source="spring.application.name"/>
<property name="LOG_LEVEL_PATTERN"
value="%clr(%5p) %clr([${spring.application.name:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]){yellow}"/>
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%10.10t]){faint} [%40.40file:%4.4line] %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 这里面定义了 CONSOLE_LOG_PATTERN, FILE_LOG_PATTERN 等日志格式, 还定义了一些日志级别 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!--滚动文件日志-->
<appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${DEV_HOME}/debug.log</file>
<append>true</append>
<encoder>
<!--日志输出格式-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${DEV_HOME}/debug.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>300MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<logger name="com.example.demo" level="DEBUG"/>
<logger name="org.apache" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<!--基础的日志输出-->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="fileLog"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 日志配置 -->
<configuration>
<springProperty name="spring.application.name" source="spring.application.name"/>
<property name="LOG_LEVEL_PATTERN" value="%5p [${spring.application.name:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]"/>
<property name="FILE_LOG_PATTERN"
value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} --- [%thread] [%file:%line] %logger - %msg%n}"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/quant_group/logs/qa-platform.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/quant_group/logs/qa-platform.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="Sentry" class="cn.quantgroup.sentry.appender.StandardSentryAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
<!-- level:基本建议ERROR or WARN -->
</filter>
</appender>
<logger name="org.springframework" level="warn"/>
<logger name="org.hibernate" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<!--基础的日志输出-->
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="Sentry"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.qg.qaplatform.zdata.mapper.QueryVccDataMapper">
<mapper namespace="cn.qg.qaplatform.zdata.mapper.VccDataMapper">
<select id="queryVccDataByStatus" resultType="cn.qg.qaplatform.zdata.domain.QueryVccUser">
<select id="queryVccDataByStatus" resultType="cn.qg.qaplatform.zdata.entity.VccUserEntity">
select
`phone_no` as phoneNo,
`user_id` as userId,
......@@ -18,7 +18,7 @@
order by id desc
</select>
<select id="queryUserVccStatus" resultType="cn.qg.qaplatform.zdata.domain.QueryVccUser">
<select id="queryUserVccStatus" resultType="cn.qg.qaplatform.zdata.entity.VccUserEntity">
select
`phone_no` as phoneNo,
`user_id` as userId,
......
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.qg.qaplatform.zdata.mapper.QueryBasicLoanStatusDataMapper">
<mapper namespace="cn.qg.qaplatform.zdata.mapper.XyqbLoanDataMapper">
<!-- 注册未申请 -->
<select id="getUnApplyLoanUserUuidList" resultType="java.lang.String">
SELECT `uuid` FROM `apply_list`
......@@ -13,7 +13,7 @@
</select>
<!-- 根据uuidList获取用户信息列表 -->
<select id="getUserDataListByUuidList" parameterType="java.util.List" resultType="cn.qg.qaplatform.zdata.domain.QueryLoanUser">
<select id="getUserDataListByUuidList" parameterType="java.util.List" resultType="cn.qg.qaplatform.zdata.entity.XjfqUserEntity">
SELECT `id` as userId, `phone_no` as phoneNo, `uuid`, `registered_from` as registeredFrom, `enable`, `created_at` as createdAt FROM `user`
where `uuid` in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
......@@ -28,7 +28,7 @@
</select>
<!-- 根据userIdList获取用户信息List -->
<select id="getUserDataListByUserIdList" resultType="cn.qg.qaplatform.zdata.domain.QueryLoanUser">
<select id="getUserDataListByUserIdList" resultType="cn.qg.qaplatform.zdata.entity.XjfqUserEntity">
SELECT `id` as userId, `uuid`, `phone_no` as phoneNo, `registered_from` as registeredFrom, `enable`, `created_at` as createdAt FROM `user`
where `id` in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
......@@ -94,7 +94,7 @@
</select>
<!-- 根据手机号获取用户信息-->
<select id="getUserInfoByPhoneNo" resultType="cn.qg.qaplatform.zdata.domain.GenLoanUser">
<select id="getUserInfoByPhoneNo" resultType="cn.qg.qaplatform.zdata.entity.XjfqGenProcessVo">
SELECT `id` as userId, `phone_no` as phoneNo, `uuid`, `registered_from` as registeredFrom, `created_at` as createdAt FROM `user`
WHERE `phone_no` = #{phoneNo}
</select>
......
......@@ -3,7 +3,7 @@ package cn.qg.qaplatform.test;
import cn.qg.qaplatform.zdata.process.Common;
import cn.qg.qaplatform.zdata.process.Xyqb;
import cn.qg.qaplatform.utils.DBUtils;
import cn.qg.qaplatform.utils.Encrypt.LexinEncrypt;
import cn.qg.qaplatform.zdata.Encrypt.LexinEncrypt;
import cn.qg.qaplatform.utils.HttpClientUtils;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.DigestUtils;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment