Commit fce613a7 authored by liwenbin's avatar liwenbin

fix conflict

parents 1dc15f97 089c6ecc
...@@ -297,12 +297,11 @@ ...@@ -297,12 +297,11 @@
<version>2.1.5</version> <version>2.1.5</version>
</dependency> </dependency>
<!-- protobuf依赖--> <!-- protobuf依赖-->
<dependency> <dependency>
<groupId>com.google.protobuf</groupId> <groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId> <artifactId>protobuf-java</artifactId>
<version>3.6.0</version> <version>2.5.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.googlecode.protobuf-java-format</groupId> <groupId>com.googlecode.protobuf-java-format</groupId>
...@@ -319,7 +318,17 @@ ...@@ -319,7 +318,17 @@
<artifactId>druid</artifactId> <artifactId>druid</artifactId>
<version>1.1.10</version> <version>1.1.10</version>
</dependency> </dependency>
<!-- ocr hbase -->
<dependency>
<groupId>com.lkb.data</groupId>
<artifactId>lkb-data-service</artifactId>
<version>1.7.8.4-3c-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies> </dependencies>
</project> </project>
...@@ -21,7 +21,7 @@ import com.alibaba.druid.pool.DruidDataSource; ...@@ -21,7 +21,7 @@ import com.alibaba.druid.pool.DruidDataSource;
@Configuration @Configuration
public class DataSourceConfig { public class DataSourceConfig {
@Value("${spring.datasource.primary.url}") @Value("${spring.datasource.primary.url}")
private String dbUrl; private String dbUrl;
@Value("${spring.datasource.primary.username}") @Value("${spring.datasource.primary.username}")
private String username; private String username;
......
...@@ -11,19 +11,24 @@ import org.apache.http.conn.ConnectionKeepAliveStrategy; ...@@ -11,19 +11,24 @@ import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy; import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContexts;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.util.ClassUtils;
import javax.net.ssl.*; import javax.net.ssl.*;
import java.io.IOException; import java.io.*;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.security.KeyManagementException; import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
...@@ -37,6 +42,9 @@ import java.security.cert.X509Certificate; ...@@ -37,6 +42,9 @@ import java.security.cert.X509Certificate;
@Configuration @Configuration
public class HttpClientConfig { public class HttpClientConfig {
@Value("${isDebug}")
private Boolean isDebug;
@Bean(name = "httpClient") @Bean(name = "httpClient")
public CloseableHttpClient httpClient() throws NoSuchAlgorithmException, KeyManagementException { public CloseableHttpClient httpClient() throws NoSuchAlgorithmException, KeyManagementException {
/** /**
...@@ -85,7 +93,7 @@ public class HttpClientConfig { ...@@ -85,7 +93,7 @@ public class HttpClientConfig {
return true; return true;
HttpClientContext clientContext = HttpClientContext.adapt(arg2); HttpClientContext clientContext = HttpClientContext.adapt(arg2);
HttpRequest request = clientContext.getRequest(); HttpRequest request = clientContext.getRequest();
if (!(request instanceof HttpEntityEnclosingRequest)) // 如果请求被认为是幂等的,那么就重试。即重复执行不影响程序其他效果的 if (!(request instanceof HttpEntityEnclosingRequest)) // 如果请求被认为是幂等的,那么就重试。即重复执行不影响程序其他效果的
return true; return true;
return false; return false;
} }
...@@ -100,5 +108,71 @@ public class HttpClientConfig { ...@@ -100,5 +108,71 @@ public class HttpClientConfig {
.build(); .build();
} }
@Bean("niwodaiHttpsClient")
public CloseableHttpClient niwodaiHttpsClient() throws Exception {
/**
* 创建TrustManager
*/
X509TrustManager xtm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
String classesPath = "/niwodai";
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(HttpClientConfig.class.getResourceAsStream(classesPath + "/qg-keystore" + (isDebug ? "-test" : "") +".jks"), "password".toCharArray());
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(HttpClientConfig.class.getResourceAsStream(classesPath + "/qg-truststore" + (isDebug ? "-test" : "") +".jks"), "password".toCharArray());
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(trustStore, new TrustSelfSignedStrategy())
.loadKeyMaterial(keyStore, "password".toCharArray())
.build();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
sslcontext,
new String[]{"TLSv1.2"},
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory)
.build();
// connection manager
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
connectionManager.setMaxTotal(10000);
connectionManager.setDefaultMaxPerRoute(1000);
HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException arg0, int retryTimes, HttpContext arg2) {
if (retryTimes >= 2)
return false;
if (arg0 instanceof UnknownHostException || arg0 instanceof ConnectTimeoutException
|| !(arg0 instanceof SSLException) || arg0 instanceof SocketTimeoutException)
return true;
HttpClientContext clientContext = HttpClientContext.adapt(arg2);
HttpRequest request = clientContext.getRequest();
if (!(request instanceof HttpEntityEnclosingRequest)) // 如果请求被认为是幂等的,那么就重试。即重复执行不影响程序其他效果的
return true;
return false;
}
};
// keep alive strategy
ConnectionKeepAliveStrategy keepAliveStrategy = new DefaultConnectionKeepAliveStrategy();
return HttpClients.custom()
.setConnectionManager(connectionManager)
.setRetryHandler(retryHandler)
.setKeepAliveStrategy(keepAliveStrategy)
.build();
}
} }
...@@ -77,7 +77,7 @@ public class ConsumerConfig implements RabbitListenerConfigurer { ...@@ -77,7 +77,7 @@ public class ConsumerConfig implements RabbitListenerConfigurer {
log.info("资金路由有效MQ消息接收, 消息内容 : {} ",ms); log.info("资金路由有效MQ消息接收, 消息内容 : {} ",ms);
String applyNo = jo.getJSONObject("data").getString("applyNo"); String applyNo = jo.getJSONObject("data").getString("applyNo");
String nextOperateDate = getNextOperateDate(jo, noticeType); String nextOperateDate = getNextOperateDate(jo, noticeType);
iAidFundRouteRecordService.fundingResultNotity(applyNo,FundingResult.fromCode(noticeType)); // iAidFundRouteRecordService.fundingResultNotity(applyNo,FundingResult.fromCode(noticeType));
distributeService.receiveFundingResult(applyNo, FundingResult.fromCode(noticeType), nextOperateDate); distributeService.receiveFundingResult(applyNo, FundingResult.fromCode(noticeType), nextOperateDate);
log.info("资金路由有效MQ消息处理结束, bizNo : {} ,noticeType : {} , 耗时 : {} ",applyNo,noticeType,stopwatch.stop().elapsed(TimeUnit.MILLISECONDS)); log.info("资金路由有效MQ消息处理结束, bizNo : {} ,noticeType : {} , 耗时 : {} ",applyNo,noticeType,stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
} }
......
package com.quantgroup.asset.distribution.constant;
/**
* @author : Hyuk
* @description : AidFundConstants
* @date : 2020/3/27 5:09 下午
*/
public class AidFundConstants {
public static class FundId {
/**
* 你我贷
*/
public static final String NIWODAI = "970";
}
}
package com.quantgroup.asset.distribution.constant;
/**
* @author : Hyuk
* @description : AidFundIncomingStatus
* @date : 2020/3/30 11:04 上午
*/
public class AidFundStatus {
/**
* 进件状态
*/
public static class Incoming {
public static int REJECT = 0;
public static int PASS = 1;
// 资方审核中
public static int WAIT = 2;
// 保留状态,如果资方进件成功改为WAIT
public static int PRE = 3;
}
/**
* 路由状态
*/
public static class Route {
// 1-准入成功
public static int PRE_PASS = 1;
// 2-准入失败
public static int PRE_REJECT = 2;
// 3-进件完成
public static int INCOMING_COMPLETE = 3;
}
}
...@@ -26,4 +26,18 @@ public class RedisKeyConstants { ...@@ -26,4 +26,18 @@ public class RedisKeyConstants {
* 分发失败节点记录 * 分发失败节点记录
*/ */
public final static String DISTRIBUTE_FAIL_TYPE_RECORD = "ASSET.DISTRIBUTE.DISTRIBUTE.FAIL.TYPE.KEY.8SAWNB_"; public final static String DISTRIBUTE_FAIL_TYPE_RECORD = "ASSET.DISTRIBUTE.DISTRIBUTE.FAIL.TYPE.KEY.8SAWNB_";
/**
* 你我贷token
*/
public static final String NI_WO_DAI_TOKEN_KEY = "ASSET.DISTRIBUTE:NIWODAI:TOKEN:YHABEA";
/**
* 完成路由的资方缓存KEY
*/
public static final String FINISH_ROUTE_AID_FUND_KEY="ASSET.DISTRIBUTE:FINISH.ROUTE.AID.FUND.KEY.IJN9_";
/**
* 助贷资方审核订单缓存KEY
*/
public static final String AID_FUND_AUDIT_ORDER_KEY = "ASSET.DISTRIBUTE:AID_FUND_AUDIT_ORDER:BY_BIZ_NO_AND_FUND_ID:AKVVS3:";
} }
...@@ -3,20 +3,17 @@ package com.quantgroup.asset.distribution.controller; ...@@ -3,20 +3,17 @@ package com.quantgroup.asset.distribution.controller;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import com.quantgroup.asset.distribution.model.entity.fund.FundConfigCondition; import com.quantgroup.asset.distribution.model.entity.fund.FundConfigCondition;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.google.common.base.Stopwatch; import com.google.common.base.Stopwatch;
import com.quantgroup.asset.distribution.constant.FundModuleConstants; import com.quantgroup.asset.distribution.constant.FundModuleConstants;
import com.quantgroup.asset.distribution.enums.response.FundModuleResponse; import com.quantgroup.asset.distribution.enums.response.FundModuleResponse;
import com.quantgroup.asset.distribution.model.response.GlobalResponse; import com.quantgroup.asset.distribution.model.response.GlobalResponse;
import com.quantgroup.asset.distribution.service.approval.IApprovalLogService;
import com.quantgroup.asset.distribution.service.funding.IFundModuleService; import com.quantgroup.asset.distribution.service.funding.IFundModuleService;
import com.quantgroup.asset.distribution.util.fund.module.ChannelFundConfigUtil; import com.quantgroup.asset.distribution.util.fund.module.ChannelFundConfigUtil;
......
package com.quantgroup.asset.distribution.controller;
import com.alibaba.fastjson.JSON;
import com.quantgroup.asset.distribution.constant.AidFundConstants;
import com.quantgroup.asset.distribution.constant.AidFundStatus;
import com.quantgroup.asset.distribution.constant.StatusConstants;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.model.response.GlobalResponse;
import com.quantgroup.asset.distribution.service.alarm.IAlarmService;
import com.quantgroup.asset.distribution.service.distribute.IAssetDistributeRecordService;
import com.quantgroup.asset.distribution.service.distribute.IAssetDistributeService;
import com.quantgroup.asset.distribution.service.funding.IAidFundAuditOrderService;
import com.quantgroup.asset.distribution.service.jpa.entity.AidLoanFundAuditOrder;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiCostant;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiIncomingCallbackResponseVO;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiIncomingResultResponseVO;
import com.quantgroup.asset.distribution.service.notify.INotifyService;
import com.quantgroup.asset.distribution.service.product.IFinanceProductService;
import com.quantgroup.asset.distribution.service.redis.IRedisService;
import com.quantgroup.asset.distribution.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.FileNotFoundException;
import java.util.Map;
/**
* @author : Hyuk
* @description : NiWoDaiContraoller
* @date : 2020/3/27 2:12 下午
*/
@RestController
@Slf4j
@RequestMapping("/niwodai")
public class NiWoDaiController {
@Autowired
private IAidFundAuditOrderService aidFundAuditOrderService;
@Autowired
private IAlarmService alarmService;
@Autowired
private IAssetDistributeService assetDistributeService;
@Autowired
private IAssetDistributeRecordService assetDistributeRecordService;
@Autowired
private IFinanceProductService financeProductService;
@Autowired
private INotifyService notifyService;
@RequestMapping("/incoming/callback")
public GlobalResponse auditResultCallback(@RequestBody NiwodaiIncomingCallbackResponseVO responseVO) {
String orderId = responseVO.getOrderId();
String type = responseVO.getType();
Integer code = responseVO.getCode();
Long timestamp = responseVO.getTimestamp();
String data = responseVO.getData();
log.info("你我贷审核进件回调收到结果, orderId : {}, type : {}, code : {}, timestamp : {}, data : {}", orderId,
type, code, timestamp, data);
AidLoanFundAuditOrder aidLoanFundAuditOrder = aidFundAuditOrderService.findByBizNoAndFundId(orderId, AidFundConstants.FundId.NIWODAI);
if (aidLoanFundAuditOrder == null) {
log.info("你我贷审核进件回调结果未找到订单, orderId : {}, type : {}, code : {}, timestamp : {}, data : {}", orderId, type, code, timestamp, data);
alarmService.dingtalkAlarm("Error", "你我贷资方审核回调结果未找到订单", "bizNo : " + orderId + " , type : " + type + " , code : " + code + " , timestamp : " + timestamp + " , data : " + data);
return GlobalResponse.success();
}
if (aidLoanFundAuditOrder.getAuditResult().intValue() != AidFundStatus.Incoming.WAIT && aidLoanFundAuditOrder.getAuditResult().intValue() != AidFundStatus.Incoming.PRE) {
log.info("你我贷进件回调结果订单重复通知结果, 请查看, orderId : {}, type : {}, code : {}, timestamp : {}, data : {}", orderId, type, code, timestamp, data);
return GlobalResponse.success();
}
if (!"APPLY".equals(type)) {
log.info("你我贷审核进件回调结果type出现错误, orderId : {}, type : {}, code : {}, timestamp : {}, data : {}", orderId, type, code, timestamp , data);
alarmService.dingtalkAlarm("Error", "你我贷审核结果回调type错误", "bizNo : " + orderId + " , type : " + type + " , code : " + code + " , timestamp : " + timestamp + " , data : " + data);
return GlobalResponse.success();
}
if (code == null || (code.intValue() != 300005 && code.intValue() != 300006)) {
log.info("你我贷审核进件回调结果code出现错误, orderId : {}, type : {}, code : {}, timestamp : {}, data : {}", orderId, type, code, timestamp , data);
alarmService.dingtalkAlarm("Error", "你我贷审核结果回调code出现错误", "bizNo : " + orderId + " , type : " + type + " , code : " + code + " , timestamp : " + timestamp + " , data : " + data);
return GlobalResponse.success();
}
AssetForm assetForm = JSON.parseObject(aidLoanFundAuditOrder.getAssetFormText(), AssetForm.class);
Asset asset = JSON.parseObject(aidLoanFundAuditOrder.getAssetText(), Asset.class);
Map<String, Object> dataMap = JSON.parseObject(aidLoanFundAuditOrder.getDataText(), Map.class);
if (300005 == code.intValue()) {
// 将助贷审核订单状态改为拒绝
aidFundAuditOrderService.updateOrderStatus(aidLoanFundAuditOrder, AidFundStatus.Incoming.REJECT);
// 将分发记录改为失败
assetDistributeRecordService.updateAssetDistributeStatus(orderId, StatusConstants.FAIL);
// 重新进行分发
assetDistributeService.distribute(assetForm, asset, dataMap);
} else {
NiwodaiIncomingResultResponseVO vo = JSON.parseObject(data, NiwodaiIncomingResultResponseVO.class);
if (!checkIncomingResult(vo)) {
log.info("你我贷审核进件回调结果data出现错误, orderId : {}, type : {}, code : {}, timestamp : {}, data : {}", orderId, type, code, timestamp, JSON.toJSONString(vo));
alarmService.dingtalkAlarm("Error", "你我贷审核结果回调data出现错误", "bizNo : " + orderId + " , type : " + type + " , code : " + code + " , timestamp : " + timestamp + " , data : " + data);
return GlobalResponse.success();
}
// 通过了直接通知资金系统
String finance = financeProductService.createSingletonFinanceProduct(vo.getApprovedAmount().toString(), String.valueOf(vo.getApproveTerm()), aidLoanFundAuditOrder.getFundId(), aidLoanFundAuditOrder.getFundProductId());
assetForm = financeProductService.checkFundResult(assetForm, finance, Long.parseLong(vo.getValidBefore()));
assetForm.setAmount(vo.getApprovedAmount().toString());
assetForm.setTerm(String.valueOf(vo.getApproveTerm()));
// 将助贷审核订单状态改为成功
aidFundAuditOrderService.updateOrderStatus(aidLoanFundAuditOrder, AidFundStatus.Incoming.PASS);
notifyService.notifyFundServer(assetForm, dataMap);
}
log.info("你我贷审核进件回调结果处理完成, orderId : {}, type : {}, code : {}, timestamp : {}, data : {}", orderId,
type, code, timestamp, data);
return GlobalResponse.success();
}
/**
* 审核通过,检验参数
* @param vo
* @return
*/
private boolean checkIncomingResult(NiwodaiIncomingResultResponseVO vo) {
if (vo == null || vo.getApprovedAmount() == null || vo.getValidBefore() == null || vo.getApproveTerm() == null) {
return false;
}
return true;
}
public static void main(String[] args) throws FileNotFoundException {
System.out.println(ResourceUtils.getURL("classpath:").getPath());
}
}
...@@ -5,6 +5,7 @@ import com.quantgroup.asset.distribution.model.response.GlobalResponse; ...@@ -5,6 +5,7 @@ import com.quantgroup.asset.distribution.model.response.GlobalResponse;
import com.quantgroup.asset.distribution.service.asset.IAssetAttributeExtendConfigService; import com.quantgroup.asset.distribution.service.asset.IAssetAttributeExtendConfigService;
import com.quantgroup.asset.distribution.service.authority.IAuthorityService; import com.quantgroup.asset.distribution.service.authority.IAuthorityService;
import com.quantgroup.asset.distribution.service.distribute.IAssetDistributeRuleConfigService; import com.quantgroup.asset.distribution.service.distribute.IAssetDistributeRuleConfigService;
import com.quantgroup.asset.distribution.service.funding.IAidLoanFundConfigService;
import com.quantgroup.asset.distribution.service.funding.IFundModuleLimitTypeService; import com.quantgroup.asset.distribution.service.funding.IFundModuleLimitTypeService;
import com.quantgroup.asset.distribution.service.redis.IRedisService; import com.quantgroup.asset.distribution.service.redis.IRedisService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -36,6 +37,8 @@ public class RedisFlushController { ...@@ -36,6 +37,8 @@ public class RedisFlushController {
private IAssetDistributeRuleConfigService assetDistributeRuleConfigService; private IAssetDistributeRuleConfigService assetDistributeRuleConfigService;
@Autowired @Autowired
private IFundModuleLimitTypeService limitTypeService; private IFundModuleLimitTypeService limitTypeService;
@Autowired
private IAidLoanFundConfigService aidLoanFundConfigService;
/** /**
* 助贷资金池刷新 * 助贷资金池刷新
...@@ -72,4 +75,13 @@ public class RedisFlushController { ...@@ -72,4 +75,13 @@ public class RedisFlushController {
if(authKey.equals(key)) { limitTypeService.clearCache(); } if(authKey.equals(key)) { limitTypeService.clearCache(); }
return GlobalResponse.success(); return GlobalResponse.success();
} }
@RequestMapping("/aid_loan_pool_flush")
public GlobalResponse AidLoanPoolFlush(String key) {
if(authKey.equals(key)) {
aidLoanFundConfigService.clearCache();
return GlobalResponse.success();
}
return GlobalResponse.error("authKey验证失败");
}
} }
package com.quantgroup.asset.distribution.enums;
import lombok.Getter;
/**
* @author : Hyuk
* @description : UserLoanType
* @date : 2020/3/26 7:10 下午
*/
public enum UserLoanType {
FIRST_APPLY(0, "首申"),
RE_APPLY(1, "复申"),
RE_LOAN(2, "复贷");
@Getter
private Integer code;
@Getter
private String title;
UserLoanType(Integer code, String title) {
this.code = code;
this.title = title;
}
}
...@@ -53,8 +53,19 @@ public enum QGExceptionType { ...@@ -53,8 +53,19 @@ public enum QGExceptionType {
NO_FUND_INFO_BEEN_HIT(3002, "未命中任何资方, bizChannel : %s, amount : %s, term : %s"), NO_FUND_INFO_BEEN_HIT(3002, "未命中任何资方, bizChannel : %s, amount : %s, term : %s"),
FUND_PRIORITY_IS_ERROR(3003, "资方优先级不符合要求, bizChannel : %s, amount : %s, term : %s"), FUND_PRIORITY_IS_ERROR(3003, "资方优先级不符合要求, bizChannel : %s, amount : %s, term : %s"),
NOT_FOUNT_CHANNEL_FUNDS_INFO(3004, "未找到渠道资方配置, 请检查; bizChannel : %s"), NOT_FOUNT_CHANNEL_FUNDS_INFO(3004, "未找到渠道资方配置, 请检查; bizChannel : %s"),
CHANNEL_FUND_CONFIG_GREATER_THAN_TOW(3005, "渠道资方有效配置大于2条,请检查; bizChannel : % s"), CHANNEL_FUND_CONFIG_GREATER_THAN_TOW(3005, "渠道资方有效配置大于2条,请检查; bizChannel : %s"),
HIT_FUND_BUT_AMOUNT_OR_TERM_IS_EMPTY(3006, "命中资方但额度或期数为空, 请检查!"); HIT_FUND_BUT_AMOUNT_OR_TERM_IS_EMPTY(3006, "命中资方但额度或期数为空, 请检查!"),
GET_USER_INFO_ERROR(3007, "用户中心获取用户信息异常!"),
USER_PHONE_NO_EMPTY(3008, "用户手机号为空"),
USER_ID_NO_EMPTY(3009, "用户身份证为空"),
USER_NAME_EMPTY(3010, "用户姓名为空"),
GET_NIWODAI_TOKEN_ERROR(3011, "获取你我贷token异常"),
NIWODAI_PRE_AUDIT_RESULAT_ERROR(3012, "你我贷准入接口返回结果异常, resposne : %s"),
NIWODAI_INCOMING_RESULT_ERROR(3013, "你我贷进件返回结果异常, resposne : % s"),
NIWODAI_INCOMING_AUDIT_RESULT_ERROR(3014, "你我贷进件审核返回结果异常, response : %s"),
OCR_DATA_MISS(3015,"OCR信息数据缺失,请核查"),
UNKNOW_AID_FUND_ID(3016, "未知的助贷资方, fundId : %s");
......
...@@ -25,8 +25,8 @@ public class AlarmServiceImpl implements IAlarmService{ ...@@ -25,8 +25,8 @@ public class AlarmServiceImpl implements IAlarmService{
private static final String ALARM_HTTP_URL = "http://alertserv-dataservice.quantgroup.cn/common/alert/dingtalk"; private static final String ALARM_HTTP_URL = "http://alertserv-dataservice.quantgroup.cn/common/alert/dingtalk";
private static final String ROBOT_WEB_HOOK = "https://oapi.dingtalk.com/robot/send?access_token=53a55ffe3d4a5398a7ba44e4fcee1a3ac006edcba9cfdc4b1f9f692ffc18a5b8"; private static final String ROBOT_WEB_HOOK = "https://oapi.dingtalk.com/robot/send?access_token=53a55ffe3d4a5398a7ba44e4fcee1a3ac006edcba9cfdc4b1f9f692ffc18a5b8";
@Value("${isDebug}") @Value("${alarmOpen}")
private Boolean isDebug; private Boolean alarmOpen;
@Autowired @Autowired
private IHttpService httpService; private IHttpService httpService;
...@@ -34,7 +34,7 @@ public class AlarmServiceImpl implements IAlarmService{ ...@@ -34,7 +34,7 @@ public class AlarmServiceImpl implements IAlarmService{
@Override @Override
public void dingtalkAlarm(String alarmLevel, String msgTitle, String msgContent) { public void dingtalkAlarm(String alarmLevel, String msgTitle, String msgContent) {
try { try {
if (isDebug) { return; } if (!alarmOpen) { return; }
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("webhook", ROBOT_WEB_HOOK); params.put("webhook", ROBOT_WEB_HOOK);
params.put("alarmLevel", alarmLevel); params.put("alarmLevel", alarmLevel);
......
package com.quantgroup.asset.distribution.service.asset.impl; package com.quantgroup.asset.distribution.service.asset.impl;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.quantgroup.asset.distribution.model.entity.fund.ChannelFundConfigNew;
import com.quantgroup.asset.distribution.service.funding.IFundModuleChannelFundConfigNewService;
import com.quantgroup.asset.distribution.service.jpa.entity.FundModuleChannelFundConfigNew;
import com.quantgroup.asset.distribution.service.rule.vo.IRuleVO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Stopwatch; import com.google.common.base.Stopwatch;
import com.quantgroup.asset.distribution.config.annotation.Attribute; import com.quantgroup.asset.distribution.config.annotation.Attribute;
import com.quantgroup.asset.distribution.enums.ExecuteType;
import com.quantgroup.asset.distribution.enums.response.AssetResponse; import com.quantgroup.asset.distribution.enums.response.AssetResponse;
import com.quantgroup.asset.distribution.exception.QGException; import com.quantgroup.asset.distribution.exception.QGException;
import com.quantgroup.asset.distribution.exception.QGExceptionType; import com.quantgroup.asset.distribution.exception.QGExceptionType;
import com.quantgroup.asset.distribution.exception.QGPreconditions;
import com.quantgroup.asset.distribution.model.entity.fund.ChannelFundConfig;
import com.quantgroup.asset.distribution.model.form.AssetForm; import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.model.response.GlobalResponse; import com.quantgroup.asset.distribution.model.response.GlobalResponse;
import com.quantgroup.asset.distribution.service.alarm.IAlarmService; import com.quantgroup.asset.distribution.service.alarm.IAlarmService;
...@@ -39,14 +16,19 @@ import com.quantgroup.asset.distribution.service.asset.IAssetAttributeService; ...@@ -39,14 +16,19 @@ import com.quantgroup.asset.distribution.service.asset.IAssetAttributeService;
import com.quantgroup.asset.distribution.service.asset.IAssetService; import com.quantgroup.asset.distribution.service.asset.IAssetService;
import com.quantgroup.asset.distribution.service.distribute.IAssetDistributeService; import com.quantgroup.asset.distribution.service.distribute.IAssetDistributeService;
import com.quantgroup.asset.distribution.service.distribute.IDistributeFailLogService; import com.quantgroup.asset.distribution.service.distribute.IDistributeFailLogService;
import com.quantgroup.asset.distribution.service.funding.IFundModuleChannelFundConfigService;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset; import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
import com.quantgroup.asset.distribution.service.jpa.entity.AssetAttributeExtendConfig; import com.quantgroup.asset.distribution.service.jpa.entity.AssetAttributeExtendConfig;
import com.quantgroup.asset.distribution.service.jpa.entity.FundModuleChannelFundConfig;
import com.quantgroup.asset.distribution.service.product.IFinanceProductHitLogService;
import com.quantgroup.asset.distribution.service.rule.IRuleService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/** /**
* 资产Service * 资产Service
...@@ -67,15 +49,7 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -67,15 +49,7 @@ public class AssetServiceImpl implements IAssetService{
private IAlarmService alarmService; private IAlarmService alarmService;
@Autowired @Autowired
private IDistributeFailLogService distributeFailLogService; private IDistributeFailLogService distributeFailLogService;
@Autowired
private IFundModuleChannelFundConfigNewService fundModuleChannelFundConfigNewService;
@Autowired
private IRuleService ruleService;
@Autowired
private IFinanceProductHitLogService financeProductHitLogService;
private static final ExecutorService executorPool = Executors.newFixedThreadPool(100);
@Async @Async
@Override @Override
...@@ -92,12 +66,6 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -92,12 +66,6 @@ public class AssetServiceImpl implements IAssetService{
assetAttributeService.saveAssetAttrubite(asset, assetAttributeExtendConfigList, data); assetAttributeService.saveAssetAttrubite(asset, assetAttributeExtendConfigList, data);
// 把资产基础属性值放入data // 把资产基础属性值放入data
data = addAssetAttributeToData(asset, data); data = addAssetAttributeToData(asset, data);
// 资方配置空跑
doTestExecute(JSON.parseObject(JSON.toJSONString(assetForm), AssetForm.class), data);
// 如果使用资方模块则去命中资方,创建金融产品集
String hitFinanceProduct = hitFundIfUseFundModule(assetForm, data, ExecuteType.ONLINE);
// 资方模块结果处理
checkFundResult(assetForm, hitFinanceProduct);
// 资产分发 // 资产分发
assetDistributeService.distribute(assetForm, asset, data); assetDistributeService.distribute(assetForm, asset, data);
log.info("资产分发完成, uuid : {}, bizNo : {}, assetNo : {}, bizChannel : {}, 耗时 : {}", assetForm.getUuid(), log.info("资产分发完成, uuid : {}, bizNo : {}, assetNo : {}, bizChannel : {}, 耗时 : {}", assetForm.getUuid(),
...@@ -222,7 +190,7 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -222,7 +190,7 @@ public class AssetServiceImpl implements IAssetService{
} }
return sb.toString(); return sb.toString();
} }
/** /**
* 如果使用资方模块,需要去命中资方 * 如果使用资方模块,需要去命中资方
* @param assetForm * @param assetForm
......
...@@ -74,8 +74,8 @@ public class AssetDistributeRecordServiceImpl implements IAssetDistributeRecordS ...@@ -74,8 +74,8 @@ public class AssetDistributeRecordServiceImpl implements IAssetDistributeRecordS
public void updateAssetDistributeStatus(String bizNo, int status) { public void updateAssetDistributeStatus(String bizNo, int status) {
AssetDistributeRecord assetDistributeRecord = assetDistributeRecordRepository.findByBizNoOrderByCreatedAtDescLimitOne(bizNo); AssetDistributeRecord assetDistributeRecord = assetDistributeRecordRepository.findByBizNoOrderByCreatedAtDescLimitOne(bizNo);
if (assetDistributeRecord == null) { if (assetDistributeRecord == null) {
if (isDebug) { return; }
log.info("资产分发记录更改状态未找到订单, bizNo : {}, status : {}", bizNo, status); log.info("资产分发记录更改状态未找到订单, bizNo : {}, status : {}", bizNo, status);
if (isDebug) { return; }
throw new QGException(QGExceptionType.NOT_FOUND_FUND_SERVER_RESULT_BIZNO, bizNo, status); throw new QGException(QGExceptionType.NOT_FOUND_FUND_SERVER_RESULT_BIZNO, bizNo, status);
} else { } else {
assetDistributeRecord.setAssetDistributeStatus(status); assetDistributeRecord.setAssetDistributeStatus(status);
......
package com.quantgroup.asset.distribution.service.funding;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
import java.util.Map;
/**
* @author : Hyuk
* @description : IAidFundAssetService
* @date : 2020/3/27 5:07 下午
*/
public interface IAidFundAssetService {
/**
* 准入审核,预审
* @param assetForm
* @return
*/
public boolean preAudit(AssetForm assetForm, String fundId);
/**
* 进件审核
* @param assetForm
* @param data
* @param userLoanType
* @return true:进件成功 false:进件失败
*/
public boolean audit(AssetForm assetForm, Map<String, Object> data, Asset asset, String fundId);
}
package com.quantgroup.asset.distribution.service.funding;
import com.quantgroup.asset.distribution.service.jpa.entity.AidLoanFundAuditOrder;
/**
* @author : Hyuk
* @description : IAidFundAuditOrderService
* @date : 2020/3/30 10:31 上午
*/
public interface IAidFundAuditOrderService {
public AidLoanFundAuditOrder saveAidFundAuditOrder(AidLoanFundAuditOrder aidLoanFundAuditOrder);
/**
* 更改助贷资金路由审核订单状态
* @param aidLoanFundAuditOrder
* @param status
* @return
*/
public AidLoanFundAuditOrder updateOrderStatus(AidLoanFundAuditOrder aidLoanFundAuditOrder, Integer status);
/**
* 根据三元素查找审核订单
* @param bizNo
* @param fundId
* @param auditResult
* @return
*/
public AidLoanFundAuditOrder findByBizNoAndFundId(String bizNo, String fundId);
}
...@@ -3,6 +3,10 @@ package com.quantgroup.asset.distribution.service.funding; ...@@ -3,6 +3,10 @@ package com.quantgroup.asset.distribution.service.funding;
import com.quantgroup.asset.distribution.enums.funding.FundingResult; import com.quantgroup.asset.distribution.enums.funding.FundingResult;
import com.quantgroup.asset.distribution.service.jpa.entity.AidLoanFundRouteRecord; import com.quantgroup.asset.distribution.service.jpa.entity.AidLoanFundRouteRecord;
import java.util.concurrent.TimeUnit;
import static com.quantgroup.asset.distribution.constant.RedisKeyConstants.FINISH_ROUTE_AID_FUND_KEY;
/** /**
* Created by renfeng on 2019/7/17. * Created by renfeng on 2019/7/17.
*/ */
...@@ -11,20 +15,37 @@ public interface IAidFundRouteRecordService { ...@@ -11,20 +15,37 @@ public interface IAidFundRouteRecordService {
/** /**
* 资金分配结果通知 * 资金分配结果通知
*
* @param bizNo * @param bizNo
* @param fundingResult * @param fundingResult
*/ */
void fundingResultNotity(String bizNo,FundingResult fundingResult); void fundingResultNotity(String bizNo, FundingResult fundingResult);
/** /**
* 保存主贷资金路由记录 * 保存主贷资金路由记录
*
* @param aidLoanFundRouteRecord * @param aidLoanFundRouteRecord
*/ */
void saveAidLoanFundRouteRecord(AidLoanFundRouteRecord aidLoanFundRouteRecord); AidLoanFundRouteRecord saveAidLoanFundRouteRecord(AidLoanFundRouteRecord aidLoanFundRouteRecord);
/**
* 根据bizNo和fundId找路由记录
*
* @param bizNo
* @param fundId
* @return
*/
AidLoanFundRouteRecord findByBizNoAndFundId(String bizNo, String fundId);
/**
* 更改助贷资金路由记录状态
*
* @param aidLoanFundRouteRecord
* @param status
* @return
*/
AidLoanFundRouteRecord updateAidLoanFundRouteRecordStatus(AidLoanFundRouteRecord aidLoanFundRouteRecord, Integer status);
} }
...@@ -4,6 +4,7 @@ import java.util.Map; ...@@ -4,6 +4,7 @@ import java.util.Map;
import com.quantgroup.asset.distribution.model.form.AssetForm; import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.model.response.GlobalResponse; import com.quantgroup.asset.distribution.model.response.GlobalResponse;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
/** /**
* Created by renfeng on 2019/7/17. * Created by renfeng on 2019/7/17.
...@@ -17,6 +18,6 @@ public interface IAidFundRouteService { ...@@ -17,6 +18,6 @@ public interface IAidFundRouteService {
* @param userLoanType * @param userLoanType
* @return * @return
*/ */
GlobalResponse aidFundRoute(AssetForm assetForm,Integer userLoanType, Map<String, Object> data); boolean aidFundRoute(AssetForm assetForm, Asset asset, Map<String, Object> data);
} }
...@@ -32,5 +32,5 @@ public interface IAidLoanFundConfigService { ...@@ -32,5 +32,5 @@ public interface IAidLoanFundConfigService {
*/ */
AidLoanFundConfig findByFundNo(String fundNo); AidLoanFundConfig findByFundNo(String fundNo);
void clearCache();
} }
package com.quantgroup.asset.distribution.service.funding;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
/**
* @author : Hyuk
* @description : IAidLOanFundUserTagService
* @date : 2020/4/28 10:43 上午
*/
public interface IAidLoanFundUserTagService {
public void saveUserTag(AssetForm assetForm, Asset asset, String fundId, String tagText);
}
package com.quantgroup.asset.distribution.service.funding.impl;
import com.quantgroup.asset.distribution.constant.AidFundConstants;
import com.quantgroup.asset.distribution.exception.QGException;
import com.quantgroup.asset.distribution.exception.QGExceptionType;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.service.funding.IAidFundAssetService;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
import com.quantgroup.asset.distribution.service.niwodai.INiwodaiAssetService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @author : Hyuk
* @description : AidFundAssetServiceIMpl
* @date : 2020/3/27 5:22 下午
*/
@Slf4j
@Service
public class AidFundAssetServiceImpl implements IAidFundAssetService {
@Autowired
private INiwodaiAssetService niwodaiAssetService;
@Override
public boolean preAudit(AssetForm assetForm, String fundId) {
switch (fundId) {
case AidFundConstants.FundId.NIWODAI : {
return niwodaiAssetService.preAudit(assetForm.getUuid()).getPass().booleanValue();
}
default :
throw new QGException(QGExceptionType.UNKNOW_AID_FUND_ID);
}
}
@Override
public boolean audit(AssetForm assetForm, Map<String, Object> data, Asset asset, String fundId) {
switch (fundId) {
case AidFundConstants.FundId.NIWODAI : {
return niwodaiAssetService.incoming(assetForm, data, asset).getCode().equals(300007);
}
default :
throw new QGException(QGExceptionType.UNKNOW_AID_FUND_ID);
}
}
}
package com.quantgroup.asset.distribution.service.funding.impl;
import com.quantgroup.asset.distribution.constant.RedisKeyConstants;
import com.quantgroup.asset.distribution.service.funding.IAidFundAuditOrderService;
import com.quantgroup.asset.distribution.service.jpa.entity.AidLoanFundAuditOrder;
import com.quantgroup.asset.distribution.service.jpa.repository.IAidLoanFundAuditOrderRepository;
import com.quantgroup.asset.distribution.service.redis.IRedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
/**
* @author : Hyuk
* @description : AidFundAuditOrderServiceIMpl
* @date : 2020/3/30 11:14 上午
*/
@Service
public class AidFundAuditOrderServiceImpl implements IAidFundAuditOrderService {
@Autowired
private IAidLoanFundAuditOrderRepository aidLoanFundAuditOrderRepository;
@Autowired
private IRedisService<AidLoanFundAuditOrder> redisService;
@Override
public AidLoanFundAuditOrder saveAidFundAuditOrder(AidLoanFundAuditOrder aidLoanFundAuditOrder) {
aidLoanFundAuditOrder = aidLoanFundAuditOrderRepository.save(aidLoanFundAuditOrder);
String key = RedisKeyConstants.AID_FUND_AUDIT_ORDER_KEY + aidLoanFundAuditOrder.getBizNo() + "_" + aidLoanFundAuditOrder.getFundId();
redisService.setEntityEx(key, aidLoanFundAuditOrder, 30, TimeUnit.MINUTES);
return aidLoanFundAuditOrder;
}
@Override
public AidLoanFundAuditOrder updateOrderStatus(AidLoanFundAuditOrder aidLoanFundAuditOrder, Integer status) {
aidLoanFundAuditOrder.setAuditResult(status);
return saveAidFundAuditOrder(aidLoanFundAuditOrder);
}
@Override
public AidLoanFundAuditOrder findByBizNoAndFundId(String bizNo, String fundId) {
String key = RedisKeyConstants.AID_FUND_AUDIT_ORDER_KEY + bizNo + "_" + fundId;
AidLoanFundAuditOrder aidLoanFundAuditOrder = redisService.getEntity(key);
if (aidLoanFundAuditOrder == null) {
aidLoanFundAuditOrder = aidLoanFundAuditOrderRepository.findByBizNoAndFundIdAndEnableIsTrue(bizNo, fundId);
if (aidLoanFundAuditOrder != null) {
redisService.setEntityEx(key, aidLoanFundAuditOrder, 30, TimeUnit.MINUTES);
}
}
return aidLoanFundAuditOrder;
}
}
...@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service; ...@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static com.quantgroup.asset.distribution.constant.RedisKeyConstants.AID_LOAN_COUNT_LIMIT_KEY; import static com.quantgroup.asset.distribution.constant.RedisKeyConstants.AID_LOAN_COUNT_LIMIT_KEY;
import static com.quantgroup.asset.distribution.constant.RedisKeyConstants.FINISH_ROUTE_AID_FUND_KEY;
/** /**
* Created by renfeng on 2019/7/19. * Created by renfeng on 2019/7/19.
...@@ -26,9 +27,8 @@ public class AidFundRouteRecordServiceImpl implements IAidFundRouteRecordService ...@@ -26,9 +27,8 @@ public class AidFundRouteRecordServiceImpl implements IAidFundRouteRecordService
@Autowired @Autowired
private IAidLoanFundRouteRecordRepository iAidLoanFundRouteRecordRepository; private IAidLoanFundRouteRecordRepository iAidLoanFundRouteRecordRepository;
@Autowired @Autowired
private IRedisService<String> redisService; private IRedisService<AidLoanFundRouteRecord> redisService;
/** /**
* 资金分配结果通知 * 资金分配结果通知
...@@ -59,9 +59,29 @@ public class AidFundRouteRecordServiceImpl implements IAidFundRouteRecordService ...@@ -59,9 +59,29 @@ public class AidFundRouteRecordServiceImpl implements IAidFundRouteRecordService
* @param aidLoanFundRouteRecord * @param aidLoanFundRouteRecord
*/ */
@Override @Override
public void saveAidLoanFundRouteRecord(AidLoanFundRouteRecord aidLoanFundRouteRecord) { public AidLoanFundRouteRecord saveAidLoanFundRouteRecord(AidLoanFundRouteRecord aidLoanFundRouteRecord) {
iAidLoanFundRouteRecordRepository.save(aidLoanFundRouteRecord); AidLoanFundRouteRecord record = iAidLoanFundRouteRecordRepository.save(aidLoanFundRouteRecord);
redisService.setEntityEx(FINISH_ROUTE_AID_FUND_KEY + record.getBizNo() + "_" + record.getFundId(),
record, 30, TimeUnit.MINUTES);
return record;
} }
@Override
public AidLoanFundRouteRecord findByBizNoAndFundId(String bizNo, String fundId) {
String key = FINISH_ROUTE_AID_FUND_KEY + bizNo + "_" + fundId;
AidLoanFundRouteRecord record = redisService.getEntity(key);
if (record == null) {
record = iAidLoanFundRouteRecordRepository.findByBizNoAndFundId(bizNo, fundId);
if (record != null) {
redisService.setEntityEx(key, record, 30, TimeUnit.MINUTES);
}
}
return record;
}
@Override
public AidLoanFundRouteRecord updateAidLoanFundRouteRecordStatus(AidLoanFundRouteRecord aidLoanFundRouteRecord, Integer status) {
aidLoanFundRouteRecord.setAidFundRouteStatus(status);
return saveAidLoanFundRouteRecord(aidLoanFundRouteRecord);
}
} }
...@@ -77,4 +77,9 @@ public class AidLoanFundConfigServiceImpl implements IAidLoanFundConfigService { ...@@ -77,4 +77,9 @@ public class AidLoanFundConfigServiceImpl implements IAidLoanFundConfigService {
public AidLoanFundConfig findByFundNo(String fundNo) { public AidLoanFundConfig findByFundNo(String fundNo) {
return iAidLoanFundConfigRepository.findByFundNo(fundNo); return iAidLoanFundConfigRepository.findByFundNo(fundNo);
} }
@Override
public void clearCache() {
redisService.del(AID_LOAN_POOLKEYS_HMSET_KEY);
}
} }
package com.quantgroup.asset.distribution.service.funding.impl;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.service.funding.IAidLoanFundUserTagService;
import com.quantgroup.asset.distribution.service.jpa.entity.AidLoanFundUserTag;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
import com.quantgroup.asset.distribution.service.jpa.repository.IAidLoanFundUserTagRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.io.Serializable;
/**
* @author : Hyuk
* @description : AidLoanFundUserTagServiceImpl
* @date : 2020/4/28 10:44 上午
*/
@Slf4j
@Service
public class AidLoanFundUserTagServiceImpl implements IAidLoanFundUserTagService {
@Autowired
private IAidLoanFundUserTagRepository aidLoanFundUserTagRepository;
@Async
@Override
public void saveUserTag(AssetForm assetForm, Asset asset, String fundId, String tagText) {
AidLoanFundUserTag aidLoanFundUserTag = new AidLoanFundUserTag();
aidLoanFundUserTag.setAssetNo(asset.getAssetNo());
aidLoanFundUserTag.setUuid(assetForm.getUuid());
aidLoanFundUserTag.setBizNo(assetForm.getBizNo());
aidLoanFundUserTag.setFundId(fundId);
aidLoanFundUserTag.setTagText(tagText);
aidLoanFundUserTag.setEnable(true);
aidLoanFundUserTagRepository.save(aidLoanFundUserTag);
}
}
...@@ -78,4 +78,8 @@ public interface IHttpService { ...@@ -78,4 +78,8 @@ public interface IHttpService {
public Map<String,String> postHasResponse(String url, Map<String, String> parameters); public Map<String,String> postHasResponse(String url, Map<String, String> parameters);
public String post(String uri, Map<String, String> headers,Map<String, String> parameters,boolean isLog,int timeOut); public String post(String uri, Map<String, String> headers,Map<String, String> parameters,boolean isLog,int timeOut);
String postNiwodai(String uri, Map<String, String> headers, Map<String, String> parameters, boolean isLog);
String postNiwodaiJson(String uri, Map<String, String> headers, String jsonParams, boolean isLog);
} }
...@@ -47,6 +47,9 @@ public class HttpServiceImpl implements IHttpService { ...@@ -47,6 +47,9 @@ public class HttpServiceImpl implements IHttpService {
@Autowired @Autowired
@Qualifier("httpClient") @Qualifier("httpClient")
private CloseableHttpClient httpClient; private CloseableHttpClient httpClient;
@Autowired
@Qualifier("niwodaiHttpsClient")
private CloseableHttpClient niwodaiHttpsClient;
@Override @Override
public String get(String uri) { public String get(String uri) {
...@@ -275,6 +278,73 @@ public class HttpServiceImpl implements IHttpService { ...@@ -275,6 +278,73 @@ public class HttpServiceImpl implements IHttpService {
IOUtils.closeQuietly(httpResponse); IOUtils.closeQuietly(httpResponse);
} }
} }
@Override
public String postNiwodai(String uri, Map<String, String> headers, Map<String, String> parameters, boolean isLog) {
return doniwodaiHttps(RequestBuilder.post(),uri,headers,parameters,isLog,TIME_OUT_60);
}
@Override
public String postNiwodaiJson(String uri,Map<String, String> headers, String jsonParams,boolean isLog) {
return doniwodaiObjectHttps(RequestBuilder.post(),uri,headers,jsonParams,isLog,TIME_OUT_60);
}
public String doniwodaiObjectHttps(RequestBuilder requestBuilder, String uri, Map<String, String> headers, String jsonParams, boolean isLog, int timeOut){
String method = requestBuilder.getMethod();
HttpEntity httpEntity = null;
CloseableHttpResponse httpResponse = null;
try {
requestBuilder.setUri(uri);
this.setConfig(requestBuilder,timeOut);
this.setHeader(requestBuilder, headers);
this.setParameter(requestBuilder, jsonParams);
httpResponse = niwodaiHttpsClient.execute(requestBuilder.build());
int statusCode = httpResponse.getStatusLine().getStatusCode();
String response = null;
if(statusCode==200){
httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity, "UTF-8");
}
if(isLog) {
LOGGER.info("{}, uri:{},parameters:{},response:{},statusCode:{}", method, uri, jsonParams,response,statusCode);
}
return response;
} catch (Exception e) {
LOGGER.error("{}, uri:{}, parameters:{}", method, uri, jsonParams, e);
return null;
} finally {
EntityUtils.consumeQuietly(httpEntity);
IOUtils.closeQuietly(httpResponse);
}
}
public String doniwodaiHttps(RequestBuilder requestBuilder, String uri, Map<String, String> headers, Map<String, String> parameters, boolean isLog, int timeOut){
String method = requestBuilder.getMethod();
HttpEntity httpEntity = null;
CloseableHttpResponse httpResponse = null;
try {
requestBuilder.setUri(uri);
this.setConfig(requestBuilder,timeOut);
this.setHeader(requestBuilder, headers);
this.setParameter(requestBuilder, parameters);
httpResponse = niwodaiHttpsClient.execute(requestBuilder.build());
int statusCode = httpResponse.getStatusLine().getStatusCode();
String response = null;
if(statusCode==200){
httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity, "UTF-8");
}
if(isLog)
LOGGER.info("{}, uri:{},parameters:{},response:{},statusCode:{}", method, uri, parameters,response,statusCode);
return response;
} catch (Exception e) {
LOGGER.error("{}, uri:{}, parameters:{}", method, uri, parameters, e);
return null;
} finally {
EntityUtils.consumeQuietly(httpEntity);
IOUtils.closeQuietly(httpResponse);
}
}
/** /**
* Set Parameter * Set Parameter
* *
......
package com.quantgroup.asset.distribution.service.jpa.entity;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author : Hyuk
* @description : AidLoanFundAuditOrder
* @date : 2020/3/30 1:28 上午
*/
@Entity
@Table(name="aid_loan_fund_audit_order")
@Data
public class AidLoanFundAuditOrder implements Serializable {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "asset_no")
private String assetNo;
@Column(name = "fund_no")
private String fundNo;
@Column(name = "uuid")
private String uuid;
@Column(name = "biz_no")
private String bizNo;
@Column(name = "fund_id")
private String fundId;
@Column(name = "fund_product_id")
private String fundProductId;
@Column(name = "asset_form_text")
private String assetFormText;
@Column(name = "asset_text")
private String assetText;
@Column(name = "data_text")
private String dataText;
// 1-通过,2-拒绝,3-审核中
@Column(name = "audit_result")
private Integer auditResult;
@Column(name = "audit_context")
private String auditContext;
@Column(name = "enable")
private Boolean enable;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
@PrePersist
public void prePersist() {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
createdAt = timestamp;
updatedAt = timestamp;
}
@PreUpdate
public void preUpdate() {
updatedAt = new Timestamp(System.currentTimeMillis());
}
}
...@@ -45,9 +45,15 @@ public class AidLoanFundConfig implements Serializable{ ...@@ -45,9 +45,15 @@ public class AidLoanFundConfig implements Serializable{
@Column(name="fund_id") @Column(name="fund_id")
private String fundId; private String fundId;
@Column(name = "fund_product_id")
private String fundProductId;
@Column(name="fund_all_amount_limit") @Column(name="fund_all_amount_limit")
private String fundAllAmountLimit; private String fundAllAmountLimit;
@Column(name="fund_rule_el")
private String fundRuleEl;
@Column(name = "enable") @Column(name = "enable")
private Boolean enable; private Boolean enable;
......
...@@ -48,6 +48,9 @@ public class AidLoanFundRouteRecord implements Serializable{ ...@@ -48,6 +48,9 @@ public class AidLoanFundRouteRecord implements Serializable{
@Column(name="fund_id") @Column(name="fund_id")
private String fundId; private String fundId;
@Column(name = "fund_product_id")
private String fundProductId;
@Column(name="aid_fund_route_no") @Column(name="aid_fund_route_no")
private String aidFundRouteNo; private String aidFundRouteNo;
......
package com.quantgroup.asset.distribution.service.jpa.entity;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
/**
* @author : Hyuk
* @description : AidLoanFundUserTag
* @date : 2020/4/28 10:38 上午
*/
@Entity
@Table(name="aid_loan_fund_user_tag")
@Data
public class AidLoanFundUserTag {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "asset_no")
private String assetNo;
@Column(name = "uuid")
private String uuid;
@Column(name = "biz_no")
private String bizNo;
@Column(name = "fund_id")
private String fundId;
@Column(name = "tag_text")
private String tagText;
@Column(name = "enable")
private Boolean enable;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
@PrePersist
public void prePersist() {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
createdAt = timestamp;
updatedAt = timestamp;
}
@PreUpdate
public void preUpdate() {
updatedAt = new Timestamp(System.currentTimeMillis());
}
}
package com.quantgroup.asset.distribution.service.jpa.entity;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* Created by renfeng on 2020/3/24.
*/
@Entity
@Table(name="customer_type_rule_config")
@Data
public class CustomerTypeRuleConfig implements Serializable{
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="customer_type_rule_no")
private String customerTypeRuleNo;
@Column(name="customer_type_rule_desc")
private String customerTypeRuleDesc;
@Column(name="customer_type")
private Integer customerType;
@Column(name="customer_type_rule_el")
private String customerTypeRuleEl;
@Column(name = "enable")
private Boolean enable;
@Column(name="created_by")
private String createdBy;
@Column(name="updated_by")
private String updatedBy;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
@PrePersist
public void prePersist() {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
createdAt = timestamp;
updatedAt = timestamp;
}
@PreUpdate
public void preUpdate() {
updatedAt = new Timestamp(System.currentTimeMillis());
}
}
package com.quantgroup.asset.distribution.service.jpa.repository;
import com.quantgroup.asset.distribution.service.jpa.entity.AidLoanFundAuditOrder;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @author : Hyuk
* @description : IAidLoanFundAuditOrderRepository
* @date : 2020/3/30 1:34 上午
*/
public interface IAidLoanFundAuditOrderRepository extends JpaRepository<AidLoanFundAuditOrder, Long> {
/**
* 根据三元素查找订单
* @param bizNo
* @param fundId
* @param auditResult
* @return
*/
public AidLoanFundAuditOrder findByBizNoAndFundIdAndEnableIsTrue(String bizNo, String fundId);
}
...@@ -13,5 +13,5 @@ public interface IAidLoanFundRouteRecordRepository extends JpaRepository<AidLoan ...@@ -13,5 +13,5 @@ public interface IAidLoanFundRouteRecordRepository extends JpaRepository<AidLoan
AidLoanFundRouteRecord findByBizNoAndAidFundRouteStatus(String bizNo,Integer aidFundRouteStatus); AidLoanFundRouteRecord findByBizNoAndAidFundRouteStatus(String bizNo,Integer aidFundRouteStatus);
AidLoanFundRouteRecord findByBizNoAndFundId(String bizNo, String fundId);
} }
package com.quantgroup.asset.distribution.service.jpa.repository;
import com.quantgroup.asset.distribution.service.jpa.entity.AidLoanFundUserTag;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @author : Hyuk
* @description : IAidLoanFundUserTag
* @date : 2020/4/28 10:42 上午
*/
public interface IAidLoanFundUserTagRepository extends JpaRepository<AidLoanFundUserTag, Long> {
}
package com.quantgroup.asset.distribution.service.jpa.repository;
import com.quantgroup.asset.distribution.service.jpa.entity.CustomerTypeRuleConfig;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* Created by renfeng on 2019/7/17.
*/
public interface ICustomerTypeRuleConfigRepository extends JpaRepository<CustomerTypeRuleConfig, Long>{
List<CustomerTypeRuleConfig> findByEnableTrue();
}
package com.quantgroup.asset.distribution.service.niwodai;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiDataImportCheckResponseVO;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiIncomingResponseVO;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiIncomingResultResponseVO;
import java.util.Map;
public interface INiwodaiAssetService {
NiwodaiIncomingResultResponseVO incomingResult(String orderId);
NiwodaiDataImportCheckResponseVO preAudit(String uuid);
NiwodaiIncomingResponseVO incoming(AssetForm assetForm, Map<String, Object> data, Asset asset);
Map<String,Object> queryUserBasic2Info(String userId, String phoneNo, boolean isQuery);
}
package com.quantgroup.asset.distribution.service.niwodai;
import com.quantgroup.asset.distribution.service.niwodai.vo.*;
public interface INiwodaiService {
NiwodaiDataImportCheckResponseVO dataImportCheck(NiwodaiDataImportCheckRequestVO requestVO, String uuid);
NiwodaiIncomingResponseVO incoming(NiwodaiIncomingRequestVO niwodaiIncomingRequestVO, String uuid);
NiwodaiIncomingResultResponseVO incoingResult(NiwodaiIncomingResultRequestVO requestVO);
}
package com.quantgroup.asset.distribution.service.niwodai.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.quantgroup.asset.distribution.constant.RedisKeyConstants;
import com.quantgroup.asset.distribution.exception.QGException;
import com.quantgroup.asset.distribution.exception.QGExceptionType;
import com.quantgroup.asset.distribution.service.httpclient.IHttpService;
import com.quantgroup.asset.distribution.service.niwodai.INiwodaiService;
import com.quantgroup.asset.distribution.service.niwodai.vo.*;
import com.quantgroup.asset.distribution.service.redis.IRedisService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Base64;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
public class NiwodaiServiceImpl implements INiwodaiService {
@Value("${niwodai.url.authDomain}")
private String domain;
@Value("${niwodai.url.dataDomain}")
private String domain2;
@Value("${niwodai.url.dataCheck}")
private String dataImportCheckUrl;
@Value("${niwodai.url.auth}")
private String authUrl;
@Value("${niwodai.url.incoming}")
private String incomingUrl;
private static String getIncomingResult = "/std/v1/apply-result";
@Value("${niwodai.client.id}")
private String clientId;
@Value("${niwodai.client.secret}")
private String clientSecret;
@Autowired
IRedisService<String> iRedisService;
@Autowired
IHttpService iHttpService;
@Override
public NiwodaiDataImportCheckResponseVO dataImportCheck(NiwodaiDataImportCheckRequestVO requestVO, String uuid) {
String token = getToken();
if (StringUtils.isEmpty(token)) {
log.error("你我贷准入检查时获取token失败, uuid : {}", uuid);
throw new QGException(QGExceptionType.GET_NIWODAI_TOKEN_ERROR);
}
String result = iHttpService.postNiwodaiJson(domain2 + dataImportCheckUrl, commonHeader(token), JSON.toJSONString(requestVO), true);
log.info("你我贷准入检查接口调用结束, uuid : {}, requestVo : {}, response : {}", uuid, JSON.toJSONString(requestVO), result);
if (StringUtils.isNotEmpty(result)) {
NiwodaiDataImportCheckResponseVO vo = JSON.parseObject(result, NiwodaiDataImportCheckResponseVO.class);
if (vo != null && vo.getPass() != null) {
return JSON.parseObject(result, NiwodaiDataImportCheckResponseVO.class);
}
}
throw new QGException(QGExceptionType.NIWODAI_PRE_AUDIT_RESULAT_ERROR, result);
}
@Override
public NiwodaiIncomingResponseVO incoming(NiwodaiIncomingRequestVO requestVO, String uuid) {
String token = getToken();
if (StringUtils.isEmpty(token)) {
log.error("你我贷进件时获取token失败, uuid : {}, bizNo : {}", uuid, requestVO.getOrderId());
throw new QGException(QGExceptionType.GET_NIWODAI_TOKEN_ERROR);
}
String result = iHttpService.postNiwodaiJson(domain2 + incomingUrl, commonHeader(token), JSON.toJSONString(requestVO),false);
log.info("你我贷进件接口审核接口结束, uuid : {}, bizNo : {}, response : {}", uuid, requestVO.getOrderId(), result);
if (StringUtils.isNotEmpty(result)) {
NiwodaiIncomingResponseVO vo = JSON.parseObject(result, NiwodaiIncomingResponseVO.class);
if (vo != null && vo.getCode() != null) {
return vo;
}
}
throw new QGException(QGExceptionType.NIWODAI_INCOMING_RESULT_ERROR);
}
@Override
public NiwodaiIncomingResultResponseVO incoingResult(NiwodaiIncomingResultRequestVO requestVO){
String token = getToken();
if (StringUtils.isEmpty(token)) {
log.error("你我贷获取进件结果时获取token失败, requestVO : {}", JSON.toJSONString(requestVO));
throw new QGException(QGExceptionType.GET_NIWODAI_TOKEN_ERROR);
}
String result = iHttpService.postNiwodaiJson(domain2 + getIncomingResult, commonHeader(token), JSON.toJSONString(requestVO),true);
if (StringUtils.isNotEmpty(result)){
NiwodaiIncomingResultResponseVO vo = JSON.parseObject(result, NiwodaiIncomingResultResponseVO.class);
if (vo != null && vo.getCode() != null) {
return vo;
}
}
throw new QGException(QGExceptionType.NIWODAI_INCOMING_AUDIT_RESULT_ERROR);
}
public String getToken() {
String token = iRedisService.getString(RedisKeyConstants.NI_WO_DAI_TOKEN_KEY);
if (StringUtils.isBlank(token)) {
NiwodaiAccessTokenResponseVO vo = acquireAccessToken();
if (vo != null){
token = vo.getAccessToken();
iRedisService.setStringEx(RedisKeyConstants.NI_WO_DAI_TOKEN_KEY,token,8, TimeUnit.MINUTES);
}else {
return null;
}
}
return token;
}
public NiwodaiAccessTokenResponseVO acquireAccessToken() {
Map<String, String> header = Maps.newHashMap();
header.put("Content-Type", "application/x-www-form-urlencoded");
header.put("Authorization", "Basic " + Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes()));
Map<String, String> parameters = Maps.newHashMap();
parameters.put("grant_type", "client_credentials");
String result = null;
try {
result = iHttpService.postNiwodai(domain + authUrl, header, parameters, true);
} catch (Exception e) {
e.printStackTrace();
}
if (StringUtils.isNotEmpty(result)) {
return JSON.parseObject(result, NiwodaiAccessTokenResponseVO.class);
}
return null;
}
private static Map<String, String> commonHeader(String token) {
Map<String, String> header = Maps.newHashMap();
header.put("Authorization", " bearer " + token);
header.put("Content-Type", "application/json");
return header;
}
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
/**
* @author fengjunkai
* @create 2018-05-25 下午 3:27
**/
@Data
public class Address implements Serializable{
private static final long serialVersionUID = 665730924402064515L;
private Long provinceCode;
private String province;
private Long cityCode;
private String city;
private Long districtCode;
private String district;
private String address;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @author fengjunkai
* @create 2018-05-25 下午 10:47
**/
@Data
public class BasicInfo2Detail implements Serializable {
private static final long serialVersionUID = 8649600289150722511L;
private String email;
private String educationEnum;
private String occupationEnum;
private String incomeRangeEnum;
private String name;
private String marryStatus;
private List<Address> addressList;
private List<Contacts> contactList;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 原本有一个联系人,为了兼容全量用户信息需要重新创建一个
*
* @author fengjunkai
* @create 2018-05-25 下午 10:57
**/
@Data
public class Contacts implements Serializable {
private static final long serialVersionUID = 3119705836615833451L;
private String name;
private String phoneNo;
private String relationName;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
@Data
@Builder
public class IdCardA implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private String gender;//性别 男/女
private String nation;//民族
private String birthday;//出生日期 格式 :1990.02.14
private String citizen_id;//身份证号
private String address;
public IdCardA(String name, String gender, String nation, String birthday, String citizen_id, String address) {
super();
this.name = name;
this.gender = gender;
this.nation = nation;
this.birthday = birthday;
this.citizen_id = citizen_id;
this.address = address;
}
public IdCardA() {
}
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
@Data
@Builder
public class IdCardB implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String agency;//签发机关
private String valid_date_begin;//有效日期之起始日期 格式:20131022
private String valid_date_end;//有效日期之结束日期 格式:20231022
public IdCardB(String agency,String valid_date_begin,String valid_date_end) {
super();
this.agency = agency;
this.valid_date_begin = valid_date_begin;
this.valid_date_end = valid_date_end;
}
public IdCardB(){
}
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class NiwodaiAccessTokenResponseVO implements Serializable {
@JsonProperty("access_token")
private String accessToken;
@JsonProperty("token_type")
private String tokenType;
@JsonProperty("expire_in")
private Long expireIn;
@JsonProperty("scope")
private String scope;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class NiwodaiDataImportCheckRequestVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 真实姓名 必填
*/
private String realName;
/**
*身份证号 必填
*/
private String idcardNumber;
/**
* 电话号码 必填
*/
private String phone;
/**
* 期望借款金额 非必填
*/
private BigDecimal amount;
/**
* 用户ID 非必填
*/
private String externalUserId;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class NiwodaiDataImportCheckResponseVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 是否通过,是:true,否:false 必须
*/
private Boolean pass;
/**
* 准入未通过原因 非必须
*/
private String reason;
public static NiwodaiDataImportCheckResponseVO createPassFalse() {
NiwodaiDataImportCheckResponseVO vo = new NiwodaiDataImportCheckResponseVO();
vo.setPass(false);
return vo;
}
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
/**
* @author : Hyuk
* @description : NiwodaiIncomingCallbackResponseVO
* @date : 2020/4/2 11:43 上午
*/
@Data
public class NiwodaiIncomingCallbackResponseVO implements Serializable {
private static final long serialVersionUID = 1L;
private String orderId;
private String type;
private Integer code;
private Long timestamp;
private String data;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
@Data
public class NiwodaiIncomingRequestVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 资产渠道唯一标识当前申请信息的流水号 必填
*/
private String orderId;
/**
* 借款人基本信息 必填
*/
private NiwodaiCostant.UserInfo userInfo;
/**
* 借款申请信息 必填
*/
private NiwodaiCostant.LoanInfo loanInfo;
/**
* 公司信息 必填
*/
private NiwodaiCostant.CompnayInfo companyInfo;
/**
* 联系人信息 必填
*/
private NiwodaiCostant.Contacts contacts;
/**
* 运营商数据 必填
*/
private NiwodaiCostant.MnoData mnoData;
/**
* 手机安装App信息,JSON序列化后的字符串(需要GZIP压缩) 非必填
*/
private String appListData;
/**
* 设备信息,JSON序列化后的字符串(需要GZIP压缩) 非必填
*/
private String deviceInfo;
/**
* 人行征信授权信息 非必填
*/
private NiwodaiCostant.CreditRefData creditRefData;
/**
* 风控数据对象
*/
private String channelRiskData;
public Map<String,Object> toMap(){
return JSONObject.parseObject(JSON.toJSONString(this));
}
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class NiwodaiIncomingResponseVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 300004:进件处理中; 300005:进件拒绝 必填
*/
private Integer code;
/**
* 描述信息 非必填
*/
private String message;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class NiwodaiIncomingResultRequestVO implements Serializable {
private String orderId;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class NiwodaiIncomingResultResponseVO implements Serializable {
/**
* 300004:进件处理中; 300005:进件拒绝; 300006: 审批通过
*/
private String code;
/**
* 审批金额
*/
private BigDecimal approvedAmount;
/**
* 最小借款金额
*/
private BigDecimal minAmount;
/**
* 步长
*/
private BigDecimal step;
/**
* 额度有效期
*/
private String validBefore;
/**
* 审批期限
*/
private Integer approveTerm;
}
...@@ -36,7 +36,8 @@ public class NotifyServiceImpl implements INotifyService{ ...@@ -36,7 +36,8 @@ public class NotifyServiceImpl implements INotifyService{
@Override @Override
public void notifyFundServer(AssetForm assetForm, Map<String, Object> data) { public void notifyFundServer(AssetForm assetForm, Map<String, Object> data) {
if (isDebug) { return; } // 测试环境也做通知
// if (isDebug) { return; }
Map<String, String> notifyMap = assetForm.transToNotifyMap(data); Map<String, String> notifyMap = assetForm.transToNotifyMap(data);
log.info("通知资金系统结果开始, uuid : {}, bizNo : {}, assetNo : {}, callbackUrl : {}, notifyForm : {}", assetForm.getUuid(), assetForm.getBizNo(), assetForm.getAssetNo(), assetForm.getCallbackUrl(), JSON.toJSONString(notifyMap)); log.info("通知资金系统结果开始, uuid : {}, bizNo : {}, assetNo : {}, callbackUrl : {}, notifyForm : {}", assetForm.getUuid(), assetForm.getBizNo(), assetForm.getAssetNo(), assetForm.getCallbackUrl(), JSON.toJSONString(notifyMap));
if (StringUtils.isEmpty(assetForm.getCallbackUrl())) { if (StringUtils.isEmpty(assetForm.getCallbackUrl())) {
......
package com.quantgroup.asset.distribution.service.product;
import com.quantgroup.asset.distribution.model.form.AssetForm;
/**
* @author : Hyuk
* @description : IFinanceProductService
* @date : 2020/3/30 5:10 下午
*/
public interface IFinanceProductService {
/**
* 创建单个资方金融产品集
* @param amount
* @param term
* @param fundId
* @return
*/
public String createSingletonFinanceProduct(String amount, String term, String fundId, String fundProId);
/**
* 结果处理
* @param assetForm
* @param hitFinanceProduct
* @return
*/
public AssetForm checkFundResult(AssetForm assetForm, String hitFinanceProduct, Long deadLine);
public AssetForm checkFundResult(AssetForm assetForm, String hitFinanceProduct);
}
package com.quantgroup.asset.distribution.service.product.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.quantgroup.asset.distribution.enums.ExecuteType;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.service.product.IFinanceProductHitLogService;
import com.quantgroup.asset.distribution.service.product.IFinanceProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author : Hyuk
* @description : FInanceProdcutServiceIMpl
* @date : 2020/3/30 5:11 下午
*/
@Slf4j
@Service
public class FinanceProductServiceImpl implements IFinanceProductService {
@Autowired
private IFinanceProductHitLogService financeProductHitLogService;
@Override
public String createSingletonFinanceProduct(String amount, String term, String fundId, String fundProId) {
JSONArray fundArray = createSingletonFundArr(fundId, fundProId);
JSONArray financeProductArray = new JSONArray();
JSONObject amountJSON = new JSONObject();
financeProductArray.add(amountJSON);
amountJSON.put("min", amount);
amountJSON.put("max", amount);
JSONArray termArray = new JSONArray();
amountJSON.put("terms", termArray);
JSONObject termJSON = new JSONObject();
termArray.add(termJSON);
try {
// 不能是string,否则资方那边会报错
termJSON.put("term", Integer.parseInt(term));
} catch (Exception e) {
termJSON.put("term", Double.parseDouble(term));
}
termJSON.put("fundInfo", fundArray);
return JSON.toJSONString(financeProductArray);
}
@Override
public AssetForm checkFundResult(AssetForm assetForm, String hitFinanceProduct, Long deadLine) {
if (hitFinanceProduct == null) {
if ("false".equals(assetForm.getAuditResult())) {
// 把传过来的额度和期数处理为null
assetForm.setAmount(null);
assetForm.setTerm(null);
}
return assetForm;
}
// 金融产品集替换
String oldFinanceProduct = assetForm.getFinanceProducts();
assetForm.setFinanceProducts(hitFinanceProduct);
// 审核结果替换
String oldAuditResult = assetForm.getAuditResult();
if ("false".equals(oldAuditResult)) {
assetForm.setAuditResult("true");
}
// 截止时间替换
if (deadLine != null) { assetForm.setDeadLine(String.valueOf(deadLine)); }
// 保存日志
financeProductHitLogService.saveLog(assetForm, oldFinanceProduct, hitFinanceProduct, oldAuditResult, assetForm.getAuditResult(), ExecuteType.ONLINE);
log.info("资方命中后,审核最终结果, assetForm : {}", JSON.toJSONString(assetForm));
return assetForm;
}
@Override
public AssetForm checkFundResult(AssetForm assetForm, String hitFinanceProduct) {
return checkFundResult(assetForm, hitFinanceProduct, null);
}
private JSONArray createSingletonFundArr(String fundId, String fundProductId) {
JSONArray fundArray = new JSONArray();
JSONObject fundInfoJSON = new JSONObject();
fundInfoJSON.put("fundId", fundId);
fundInfoJSON.put("fundProductId", fundProductId);
fundInfoJSON.put("priority", 1);
fundInfoJSON.put("feeType", 1);
fundInfoJSON.put("rateType", 1);
fundInfoJSON.put("rate", 0);
fundArray.add(fundInfoJSON);
return fundArray;
}
}
package com.quantgroup.asset.distribution.util;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AddressResolutionUtil {
public static Map<String, String> addressResolution(String address) {
String regex = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)";
Matcher m = Pattern.compile(regex).matcher(address);
String province, city, county, town, village;
Map<String, String> row = null;
while (m.find()) {
row = new LinkedHashMap<String, String>();
province = m.group("province");
row.put("province", province == null ? "" : province.trim());
city = m.group("city");
row.put("city", city == null ? "" : city.trim());
county = m.group("county");
row.put("county", county == null ? "" : county.trim());
town = m.group("town");
row.put("town", town == null ? "" : town.trim());
village = m.group("village");
row.put("village", village == null ? "" : village.trim());
}
return row;
}
}
package com.quantgroup.asset.distribution.util; package com.quantgroup.asset.distribution.util;
import java.sql.Timestamp;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
...@@ -27,4 +28,14 @@ public class DateUtil { ...@@ -27,4 +28,14 @@ public class DateUtil {
public static String getCurDateTime() { public static String getCurDateTime() {
return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
} }
/**
* 将时间类型字符串转换为Long类型
* @param dateTime
* @param pattern
* @return
*/
public static Long transStringToLong(String dateTime, String pattern) {
return Timestamp.valueOf(LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(pattern))).getTime();
}
} }
package com.quantgroup.asset.distribution.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class GZIPUtils {
public static String compress(String primStr) {
if (primStr == null || primStr.length() == 0) {
return primStr;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = null;
try {
gzip = new GZIPOutputStream(out);
gzip.write(primStr.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (gzip != null) {
try {
gzip.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return new sun.misc.BASE64Encoder().encode(out.toByteArray());
}
/**
* 使用gzip进行解压缩
*/
public static String uncompress(String compressedStr) {
if (compressedStr == null) {
return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = null;
GZIPInputStream ginzip = null;
byte[] compressed = null;
String decompressed = null;
try {
compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
in = new ByteArrayInputStream(compressed);
ginzip = new GZIPInputStream(in);
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = ginzip.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ginzip != null) {
try {
ginzip.close();
} catch (IOException e) {
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
try {
out.close();
} catch (IOException e) {
}
}
return decompressed;
}
}
...@@ -7,10 +7,10 @@ ...@@ -7,10 +7,10 @@
value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} --- [%thread] [%file:%line] %logger - %msg%n}"/> 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"> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/vpants/shaun/asset-distribution-9051/logs/rule-engine.log</file> <file>/vpants/shaun/asset-distribution-9051/logs/asset-distribution.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern> <fileNamePattern>
/vpants/shaun/asset-distribution-9051/logs/rule-engine.log.%d{yyyy-MM-dd} /vpants/shaun/asset-distribution-9051/logs/asset-distribution.log.%d{yyyy-MM-dd}
</fileNamePattern> </fileNamePattern>
<maxHistory>7</maxHistory> <maxHistory>7</maxHistory>
</rollingPolicy> </rollingPolicy>
......
package com.quantgroup.asset.distribution.niwodai;
import cn.quantgroup.user.IUserSdkService;
import cn.quantgroup.user.UserSdkServiceFactory;
import com.alibaba.fastjson.JSON;
import com.quantgroup.asset.distribution.AssetDistributionBootstrap;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.service.funding.IFundModuleService;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
import com.quantgroup.asset.distribution.service.niwodai.INiwodaiAssetService;
import com.quantgroup.asset.distribution.service.niwodai.INiwodaiService;
import com.quantgroup.asset.distribution.service.niwodai.vo.*;
import com.quantgroup.asset.distribution.util.GZIPUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AssetDistributionBootstrap.class)
public class NiwodaiTest {
@Autowired
private INiwodaiService niwodaiService;
@Autowired
private INiwodaiAssetService niwodaiAssetService;
@Autowired
@Qualifier("httpClient")
private CloseableHttpClient httpClient;
@Value("${user.sdk.url}")
private String userSysUrl;
private IUserSdkService userSdkService;
@Autowired
private IFundModuleService fundModuleService;
@PostConstruct
private void init() {
userSdkService = UserSdkServiceFactory.generateSDKService(userSysUrl, httpClient);
}
// @Test
// public void testCheck() throws Exception {
// NiwodaiDataImportCheckResponseVO responseVO = niwodaiAssetService.dataCheck("9f7f857c-10c3-42aa-8fc5-31c37e988b3e");
// System.out.println(JSON.toJSONString(responseVO));
// }
//
// @Test
// public void testUser(){
// Map<String,Object> userInfoByUuid = niwodaiAssetService.queryUserBasic2Info("ae7d04bf-1c5a-475b-98d2-b193be88cf2f","13780000000",true);
// System.out.println(JSON.toJSONString(userInfoByUuid));
// }
//
// @Test
// public void userBase(){
// System.out.println(JSON.toJSONString(userSdkService.findUserInfoByUuid("097aae98-5da4-428b-aa40-93530b6b5f4b")));
// }
//
//
//
@Test
public void testIncoming() {
AssetForm assetForm = new AssetForm();
assetForm.setUuid("2f0c65a8-c94e-4e03-87c6-b0ae99b100f0");
assetForm.setBizNo("AN000000135785633731526656");
NiwodaiIncomingResponseVO vo = niwodaiAssetService.incoming(assetForm,new HashMap<>(),new Asset());
System.out.println(JSON.toJSONString(vo));
}
//
@Test
public void testResult(){
NiwodaiIncomingResultResponseVO vo = niwodaiAssetService.incomingResult("AN000000135785633731526656");
System.out.println(JSON.toJSONString(vo));
}
//
// @Test
// public void testFund(){
// fundModuleService.getAllConditionsOfFundConfig(1L);
// }
//
// @Test
// public void testFundResult(){
// List<FundConfigCondition> list = ((FundConfigSimulationVO)fundModuleService.getAllConditionsOfFundConfig(7L).getBody()).getConditionsCase();
// fundModuleService.simulationCases(list,7L);
// }
}
app.id=asset-distribution
namespace=application,tech.service.urls,tech.common,tech.sleuth,tech.deploy,tech.msg.sdk
\ 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="%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="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${FILE_LOG_PATTERN}</pattern>
</layout>
</appender>
<logger name="com.atomikos" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="org.mybatis" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<logger name="org.apache.kafka.clients" level="error"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
<?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/asset-distribution.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
/home/quant_group/logs/asset-distribution.log.%d{yyyy-MM-dd}
</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="com.atomikos" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="org.mybatis" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<logger name="org.apache.kafka.clients" level="error"/>
<root level="info">
<appender-ref ref="FILE"/>
</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/asset-distribution/logs/asset-distribution.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
/home/quant_group/asset-distribution/logs/asset-distribution.log.%d{yyyy-MM-dd}
</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- logstash -->
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>172.30.220.6:9623</destination>
<!-- encoder is required -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<logger name="com.atomikos" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="org.mybatis" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<logger name="org.apache.kafka.clients" level="error"/>
<root level="info">
<appender-ref ref="FILE"/>
<appender-ref ref="stash"/>
</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>/vpants/shaun/asset-distribution-9051/logs/rule-engine.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
/vpants/shaun/asset-distribution-9051/logs/rule-engine.log.%d{yyyy-MM-dd}
</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="com.atomikos" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="org.mybatis" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<logger name="org.apache.kafka.clients" level="error"/>
<root level="info">
<appender-ref ref="FILE"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!-- 测试环境+开发环境. 多个使用逗号隔开. -->
<springProfile name="test,dev">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{ISO8601} [%thread] [%-5level] %logger - %msg%n</pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/rule-engine.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/asset-distribution.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{ISO8601} [%thread] [%-5level] %logger - %msg%n</pattern>
</layout>
</appender>
<logger name="com.atomikos" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="org.mybatis" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<logger name="org.apache.kafka.clients" level="error"/>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</springProfile>
<!-- 生产环境. -->
<springProfile name="product">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{ISO8601} [%thread] [%-5level] %logger - %msg%n</pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/quant_group/asset-distribution/logs/asset-distribution.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/quant_group/asset-distribution/logs/asset-distribution.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{ISO8601} [%thread] [%-5level] %logger - %msg%n</pattern>
</layout>
</appender>
<!-- logstash -->
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>172.30.220.6:9650</destination>
<!-- encoder is required -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<logger name="org.springframework" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<logger name="org.apache.kafka.clients" level="error"/>
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="stash"/>
</root>
</springProfile>
</configuration>
\ No newline at end of file
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