Commit a16693a8 authored by 郑建's avatar 郑建

Merge remote-tracking branch 'origin/zj-niwodai' into zj-niwodai

# Conflicts:
#	src/main/java/com/quantgroup/asset/distribution/controller/FundModuleController.java
#	src/test/java/com/quantgroup/asset/distribution/niwodai/NiwodaiTest.java
parents 3869dd56 210a7969
......@@ -21,9 +21,12 @@ import com.alibaba.druid.pool.DruidDataSource;
@Configuration
public class DataSourceConfig {
private String dbUrl = "jdbc:mysql://172.17.5.9:31024/asset_distribution?useUnicode=true&characterEncoding=utf-8";
private String username = "qa";
private String password = "qatest";
@Value("${spring.datasource.primary.url}")
private String dbUrl;
@Value("${spring.datasource.primary.username}")
private String username;
@Value("${spring.datasource.primary.password}")
private String password;
@Value("${spring.datasource.primary.driver-class-name}")
private String driverClassName;
......
......@@ -125,11 +125,11 @@ public class HttpClientConfig {
return null;
}
};
String classesPath= ClassUtils.getDefaultClassLoader().getResource("").getPath();
String classesPath = this.getClass().getClassLoader().getResource("niwodai/").getPath();
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream(new File(classesPath + "/niwodai/" + "qg-keystore.jks")), "password".toCharArray());
keyStore.load(new FileInputStream(new File(classesPath + "qg-keystore.jks")), "password".toCharArray());
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(classesPath + "/niwodai/" + "qg-truststore.jks"), "password".toCharArray(), new TrustSelfSignedStrategy())
.loadTrustMaterial(new File(classesPath + "qg-truststore.jks"), "password".toCharArray(), new TrustSelfSignedStrategy())
.loadKeyMaterial(keyStore, "password".toCharArray())
.build();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
......
......@@ -77,7 +77,7 @@ public class ConsumerConfig implements RabbitListenerConfigurer {
log.info("资金路由有效MQ消息接收, 消息内容 : {} ",ms);
String applyNo = jo.getJSONObject("data").getString("applyNo");
String nextOperateDate = getNextOperateDate(jo, noticeType);
iAidFundRouteRecordService.fundingResultNotity(applyNo,FundingResult.fromCode(noticeType));
// iAidFundRouteRecordService.fundingResultNotity(applyNo,FundingResult.fromCode(noticeType));
distributeService.receiveFundingResult(applyNo, FundingResult.fromCode(noticeType), nextOperateDate);
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;
}
}
......@@ -29,10 +29,15 @@ public class RedisKeyConstants {
/**
* 你我贷token
*/
public static final String NI_WO_DAI_TOKEN_KEY = "DATA_EXPORT_PLATFORM:NIWODAI:TOKEN:YHABEA";
public static final String NI_WO_DAI_TOKEN_KEY = "ASSET.DISTRIBUTE:NIWODAI:TOKEN:YHABEA";
/**
* 完成路由的资方缓存KEY
*/
public static final String FINISH_ROUTE_AID_FUND_KEY="FINISH.ROUTE.AID.FUND.KEY.IJN9_";
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:";
}
package com.quantgroup.asset.distribution.controller;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.quantgroup.asset.distribution.model.entity.fund.FundConfigCondition;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Stopwatch;
import com.quantgroup.asset.distribution.constant.FundModuleConstants;
import com.quantgroup.asset.distribution.enums.response.FundModuleResponse;
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.util.fund.module.ChannelFundConfigUtil;
......@@ -112,11 +106,6 @@ public class FundModuleController {
return findChannelFundConfigCommon(configId, 2);
}
@RequestMapping("/simulation/conditions")
public GlobalResponse allConditions(Long configId){
return fundConfigConditions(configId);
}
private GlobalResponse saveChannelFundsConfigCommon(Integer type, Long id, String bizChannel, String funds, String remarks,
String auditor, String proposer, int oldOrNew) {
log.info("资方模块接口, 新增或修改资方配置开始, type : {}, id : {}, bizChannel : {}, funds : {}, remarks : {}, auditor : {}, proposer : {}", type, id, bizChannel, funds, remarks, auditor, proposer);
......@@ -190,25 +179,4 @@ public class FundModuleController {
return response;
}
private GlobalResponse fundConfigConditions(Long configId){
log.info("资方模块接口,根据id获取所有案例, configId : {}", configId);
if (configId == null) {
return GlobalResponse.create(FundModuleResponse.ID_IS_EMPTY);
}
Stopwatch stopwatch = Stopwatch.createStarted();
GlobalResponse response = fundModuleService.getAllConditionsOfFundConfig(configId);
log.info("资方模块接口,根据id获取所有案例, configId : {} 耗时 : {}, response : {}", configId, stopwatch.stop().elapsed(TimeUnit.MILLISECONDS), JSON.toJSONString(response));
return response;
}
private GlobalResponse simulation(List<FundConfigCondition> configConditions,Long configId){
log.info("资方模块接口,根据案例进行空跑, configConditions : {}", configConditions);
if (CollectionUtils.isEmpty(configConditions)) {
return GlobalResponse.create(FundModuleResponse.ID_IS_EMPTY);
}
Stopwatch stopwatch = Stopwatch.createStarted();
GlobalResponse response = fundModuleService.simulationCases(configConditions,configId);
log.info("资方模块接口,根据id获取所有案例, configConditions : {} 耗时 : {}, response : {}", configConditions, stopwatch.stop().elapsed(TimeUnit.MILLISECONDS), JSON.toJSONString(response));
return response;
}
}
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.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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
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(String orderId, String type, Integer code, Long timestamp, String data) {
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 != 300005 && code != 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) {
// 将助贷审核订单状态改为拒绝
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(), NiwodaiCostant.AUDIT_TERM, AidFundConstants.FundId.NIWODAI, null);
assetForm = financeProductService.checkFundResult(assetForm, finance, Long.parseLong(vo.getValidBefore()));
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) {
return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
}
}
......@@ -43,8 +43,4 @@ public enum RuleOperator {
log.error("枚举不存在,code={}", code);
throw new QGException(QGExceptionType.COMMON_ILLEGAL_PARAM);
}
public String getCode() {
return this.code;
}
}
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 {
NO_FUND_INFO_BEEN_HIT(3002, "未命中任何资方, 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"),
CHANNEL_FUND_CONFIG_GREATER_THAN_TOW(3005, "渠道资方有效配置大于2条,请检查; bizChannel : % s"),
HIT_FUND_BUT_AMOUNT_OR_TERM_IS_EMPTY(3006, "命中资方但额度或期数为空, 请检查!");
CHANNEL_FUND_CONFIG_GREATER_THAN_TOW(3005, "渠道资方有效配置大于2条,请检查; bizChannel : %s"),
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");
......
package com.quantgroup.asset.distribution.model.entity.fund;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class FundConfigCondition implements Serializable {
private static final long serialVersionUID = 1L;
private String conditionTempId;
private List<Condition> condition;
private Result result;
@Data
public static class Condition{
private String conditionCode;
private String conditionName;
private String conditionValue;
}
@Data
public static class Result{
private Boolean success;
private String fundInfo;
}
}
......@@ -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 ROBOT_WEB_HOOK = "https://oapi.dingtalk.com/robot/send?access_token=53a55ffe3d4a5398a7ba44e4fcee1a3ac006edcba9cfdc4b1f9f692ffc18a5b8";
@Value("${isDebug}")
private Boolean isDebug;
@Value("${alarmOpen}")
private Boolean alarmOpen;
@Autowired
private IHttpService httpService;
......@@ -34,7 +34,7 @@ public class AlarmServiceImpl implements IAlarmService{
@Override
public void dingtalkAlarm(String alarmLevel, String msgTitle, String msgContent) {
try {
if (isDebug) { return; }
if (!alarmOpen) { return; }
Map<String, String> params = new HashMap<>();
params.put("webhook", ROBOT_WEB_HOOK);
params.put("alarmLevel", alarmLevel);
......
......@@ -74,8 +74,8 @@ public class AssetDistributeRecordServiceImpl implements IAssetDistributeRecordS
public void updateAssetDistributeStatus(String bizNo, int status) {
AssetDistributeRecord assetDistributeRecord = assetDistributeRecordRepository.findByBizNoOrderByCreatedAtDescLimitOne(bizNo);
if (assetDistributeRecord == null) {
if (isDebug) { return; }
log.info("资产分发记录更改状态未找到订单, bizNo : {}, status : {}", bizNo, status);
if (isDebug) { return; }
throw new QGException(QGExceptionType.NOT_FOUND_FUND_SERVER_RESULT_BIZNO, bizNo, status);
} else {
assetDistributeRecord.setAssetDistributeStatus(status);
......
......@@ -28,6 +28,7 @@ import com.quantgroup.asset.distribution.service.jpa.entity.AssetDistributeRuleC
import com.quantgroup.asset.distribution.service.jpa.entity.FundModuleChannelFundConfigNew;
import com.quantgroup.asset.distribution.service.notify.INotifyService;
import com.quantgroup.asset.distribution.service.product.IFinanceProductHitLogService;
import com.quantgroup.asset.distribution.service.product.IFinanceProductService;
import com.quantgroup.asset.distribution.service.redis.IRedisService;
import com.quantgroup.asset.distribution.service.rule.IRuleService;
import com.quantgroup.asset.distribution.service.rule.vo.IRuleVO;
......@@ -74,6 +75,8 @@ public class AssetDistributeServiceImpl implements IAssetDistributeService{
@Autowired
private IRuleService ruleService;
@Autowired
private IFinanceProductService financeProductService;
@Autowired
private IFinanceProductHitLogService financeProductHitLogService;
private static final ExecutorService executorPool = Executors.newFixedThreadPool(4);
......@@ -108,6 +111,10 @@ public class AssetDistributeServiceImpl implements IAssetDistributeService{
assetForm.getUuid(), assetForm.getBizNo(), assetForm.getAssetNo(), assetForm.getBizChannel(), ruleConfig.getId(), ruleConfig.getAssetDistributeRuleName(),
distributeStatus);
success = true;
} else if (distributeStatus == StatusConstants.FAIL) {
// 如果分发失败,直接更改状态
assetDistributeRecord.setAssetDistributeStatus(StatusConstants.FAIL);
assetDistributeRecordService.updateAssetDistribute(assetDistributeRecord);
}
}
// 保存节点尝试记录
......@@ -135,28 +142,22 @@ public class AssetDistributeServiceImpl implements IAssetDistributeService{
try {
switch (ruleType) {
case DistributeConstants.RuleType.FUND_ROUTE:
// 资方配置空跑
// 资方配置空跑,这里的目的是深度拷贝一个新对象,避免发生错乱
doTestExecute(JSON.parseObject(JSON.toJSONString(assetForm), AssetForm.class), data);
// 如果使用资方模块则去命中资方,创建金融产品集
String hitFinanceProduct = hitFundIfUseFundModule(assetForm, data, ExecuteType.ONLINE);
// 资方模块结果处理
checkFundResult(assetForm, hitFinanceProduct);
financeProductService.checkFundResult(assetForm, hitFinanceProduct);
if(StringUtils.isNotEmpty(hitFinanceProduct)) {
notifyService.notifyFundServer(assetForm, data);
return StatusConstants.WAIT;
}
return StatusConstants.FAIL;
case DistributeConstants.RuleType.AID_FUND_ROUTE: {
GlobalResponse response = aidFundRouteService.aidFundRoute(assetForm, asset.getUserLoanType(), data);
int status = response.getCode() == 0 ? StatusConstants.WAIT : StatusConstants.FAIL;
//助贷资金路由 分配失败没有 mq消息 成功有
if(status==0){
// 助贷资金路由目前不从mq里接受终态
assetDistributeRecord.setAssetDistributeStatus(status);
assetDistributeRecordService.updateAssetDistribute(assetDistributeRecord);
}
return status;
}case DistributeConstants.RuleType.DIVERSION:
boolean response = aidFundRouteService.aidFundRoute(assetForm, asset, data);
return response ? StatusConstants.WAIT : StatusConstants.FAIL;
}
case DistributeConstants.RuleType.DIVERSION:
notifyService.notifyFundServer(assetForm, data);
return StatusConstants.WAIT;
default:
......@@ -230,7 +231,10 @@ public class AssetDistributeServiceImpl implements IAssetDistributeService{
try {
Stopwatch stopwatch = Stopwatch.createStarted();
// 1、更改分配记录状态
assetDistributeRecordService.updateAssetDistributeStatus(bizNo, fundingResult == FundingResult.FUAD_ASSIGN_SUCC ? StatusConstants.SUCCESS : StatusConstants.FAIL);
if (fundingResult != FundingResult.HANG_UP) {
// HANG_UP不更改,
assetDistributeRecordService.updateAssetDistributeStatus(bizNo, fundingResult == FundingResult.FUAD_ASSIGN_SUCC ? StatusConstants.SUCCESS : StatusConstants.FAIL);
}
// 2、通知业务流系统
notifyService.notifyBusinessFlow(bizNo, fundingResult, nextOperateDate);
// 3、重新进行分发, 目前还没有,等接了助贷资金路由以后再增加
......@@ -329,38 +333,6 @@ public class AssetDistributeServiceImpl implements IAssetDistributeService{
return hitFinanceProduct;
}
/**
* 资方模块命中后结果处理
* @param assetForm
* @param hitFinanceProduct
* @return
*/
private AssetForm checkFundResult(AssetForm assetForm, String hitFinanceProduct) {
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");
}
// 保存日志
financeProductHitLogService.saveLog(assetForm, oldFinanceProduct, hitFinanceProduct, oldAuditResult, assetForm.getAuditResult(), ExecuteType.ONLINE);
log.info("资方命中后,审核最终结果, assetForm : {}", JSON.toJSONString(assetForm));
return assetForm;
}
/**
* 组建金融产品集
* @param assetForm
......
package com.quantgroup.asset.distribution.service.funding;
import com.quantgroup.asset.distribution.model.form.AssetForm;
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, Integer userLoanType, 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;
import com.quantgroup.asset.distribution.enums.funding.FundingResult;
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.
*/
......@@ -11,20 +15,37 @@ public interface IAidFundRouteRecordService {
/**
* 资金分配结果通知
*
* @param bizNo
* @param fundingResult
*/
void fundingResultNotity(String bizNo,FundingResult fundingResult);
void fundingResultNotity(String bizNo, FundingResult fundingResult);
/**
* 保存主贷资金路由记录
*
* @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;
import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.model.response.GlobalResponse;
import com.quantgroup.asset.distribution.service.jpa.entity.Asset;
/**
* Created by renfeng on 2019/7/17.
......@@ -17,6 +18,6 @@ public interface IAidFundRouteService {
* @param userLoanType
* @return
*/
GlobalResponse aidFundRoute(AssetForm assetForm,Integer userLoanType, Map<String, Object> data);
boolean aidFundRoute(AssetForm assetForm, Asset asset, Map<String, Object> data);
}
package com.quantgroup.asset.distribution.service.funding;
import com.quantgroup.asset.distribution.config.annotation.HandleException;
import com.quantgroup.asset.distribution.model.entity.fund.FundConfigCondition;
import com.quantgroup.asset.distribution.model.response.GlobalResponse;
import java.util.List;
/**
* 资方模块Service
* @author liwenbin
......@@ -103,8 +99,4 @@ public interface IFundModuleService {
* @return
*/
public GlobalResponse audit(Long id, Integer auditStatus);
GlobalResponse getAllConditionsOfFundConfig(Long configId);
GlobalResponse simulationCases(List<FundConfigCondition> configConditions,Long configId);
}
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.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, Integer userLoanType, String fundId) {
switch (fundId) {
case AidFundConstants.FundId.NIWODAI : {
return niwodaiAssetService.incoming(assetForm, data, userLoanType).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;
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.FINISH_ROUTE_AID_FUND_KEY;
/**
* Created by renfeng on 2019/7/19.
......@@ -26,9 +27,8 @@ public class AidFundRouteRecordServiceImpl implements IAidFundRouteRecordService
@Autowired
private IAidLoanFundRouteRecordRepository iAidLoanFundRouteRecordRepository;
@Autowired
private IRedisService<String> redisService;
private IRedisService<AidLoanFundRouteRecord> redisService;
/**
* 资金分配结果通知
......@@ -59,9 +59,29 @@ public class AidFundRouteRecordServiceImpl implements IAidFundRouteRecordService
* @param aidLoanFundRouteRecord
*/
@Override
public void saveAidLoanFundRouteRecord(AidLoanFundRouteRecord aidLoanFundRouteRecord) {
iAidLoanFundRouteRecordRepository.save(aidLoanFundRouteRecord);
public AidLoanFundRouteRecord saveAidLoanFundRouteRecord(AidLoanFundRouteRecord 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);
}
}
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 = "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());
}
}
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
AidLoanFundRouteRecord findByBizNoAndAidFundRouteStatus(String bizNo,Integer aidFundRouteStatus);
AidLoanFundRouteRecord findByBizNoAndFundId(String bizNo, String fundId);
}
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;
......@@ -11,9 +13,9 @@ public interface INiwodaiAssetService {
NiwodaiIncomingResultResponseVO incomingResult(String orderId);
NiwodaiDataImportCheckResponseVO dataCheck(String uuid);
NiwodaiDataImportCheckResponseVO preAudit(String uuid);
NiwodaiIncomingResponseVO incoming(String uuid, String orderId, String amount, Integer term);
NiwodaiIncomingResponseVO incoming(AssetForm assetForm, Map<String, Object> data, Integer userLoanType);
Map<String,Object> queryUserBasic2Info(String userId, String phoneNo, boolean isQuery);
}
......@@ -5,10 +5,9 @@ import com.quantgroup.asset.distribution.service.niwodai.vo.*;
public interface INiwodaiService {
NiwodaiDataImportCheckResponseVO dataImportCheck(NiwodaiDataImportCheckRequestVO requestVO);
NiwodaiDataImportCheckResponseVO dataImportCheck(NiwodaiDataImportCheckRequestVO requestVO, String uuid);
NiwodaiIncomingResponseVO incoming(NiwodaiIncomingRequestVO niwodaiIncomingRequestVO, String uuid);
NiwodaiIncomingResponseVO incoming(NiwodaiIncomingRequestVO niwodaiIncomingRequestVO);
NiwodaiIncomingResultResponseVO incoingResult(NiwodaiIncomingResultRequestVO requestVO);
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.*;
......@@ -18,9 +20,6 @@ import java.util.Base64;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static com.quantgroup.asset.distribution.exception.QGExceptionType.COMMON_THIRD_PARTY_TIMEOUT;
@Slf4j
@Service
public class NiwodaiServiceImpl implements INiwodaiService {
......@@ -46,48 +45,58 @@ public class NiwodaiServiceImpl implements INiwodaiService {
IHttpService iHttpService;
@Override
public NiwodaiDataImportCheckResponseVO dataImportCheck(NiwodaiDataImportCheckRequestVO requestVO) {
public NiwodaiDataImportCheckResponseVO dataImportCheck(NiwodaiDataImportCheckRequestVO requestVO, String uuid) {
String token = getToken();
if (StringUtils.isEmpty(token)) {
log.error("你我贷准入检查时获取token失败,requestVO : {}", JSON.toJSONString(requestVO));
throw new QGException("你我贷准入检查时获取token失败", COMMON_THIRD_PARTY_TIMEOUT);
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);
String result = iHttpService.postNiwodaiJson(domain2 + dataImportCheckUrl, commonHeader(token), JSON.toJSONString(requestVO), false);
log.info("你我贷准入检查接口调用结束, uuid : {}, requestVo : {}, response : {}", uuid, JSON.toJSONString(requestVO), result);
if (StringUtils.isNotEmpty(result)) {
return JSON.parseObject(result, NiwodaiDataImportCheckResponseVO.class);
NiwodaiDataImportCheckResponseVO vo = JSON.parseObject(result, NiwodaiDataImportCheckResponseVO.class);
if (vo != null && vo.getPass() != null) {
return JSON.parseObject(result, NiwodaiDataImportCheckResponseVO.class);
}
}
return null;
throw new QGException(QGExceptionType.NIWODAI_PRE_AUDIT_RESULAT_ERROR, result);
}
@Override
public NiwodaiIncomingResponseVO incoming(NiwodaiIncomingRequestVO requestVO) {
public NiwodaiIncomingResponseVO incoming(NiwodaiIncomingRequestVO requestVO, String uuid) {
String token = getToken();
if (StringUtils.isEmpty(token)) {
log.error("你我贷进件时获取token失败,requestVO : {}", JSON.toJSONString(requestVO));
throw new QGException("你我贷进件时获取token失败", COMMON_THIRD_PARTY_TIMEOUT);
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),true);
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)) {
return JSON.parseObject(result, NiwodaiIncomingResponseVO.class);
NiwodaiIncomingResponseVO vo = JSON.parseObject(result, NiwodaiIncomingResponseVO.class);
if (vo != null && vo.getCode() != null) {
return vo;
}
}
return null;
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("你我贷获取进件结果时获取token失败", COMMON_THIRD_PARTY_TIMEOUT);
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)){
return JSON.parseObject(result, NiwodaiIncomingResultResponseVO.class);
NiwodaiIncomingResultResponseVO vo = JSON.parseObject(result, NiwodaiIncomingResultResponseVO.class);
if (vo != null && vo.getCode() != null) {
return vo;
}
}
return null;
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)) {
......
......@@ -5,6 +5,10 @@ import lombok.Data;
import java.math.BigDecimal;
public class NiwodaiCostant {
// 你我贷审核期数固定为12期
public static final String AUDIT_TERM = "12";
@Data
public static class UserInfo {
/**
......@@ -642,4 +646,21 @@ public class NiwodaiCostant {
UNKNOWN;
}
/**
* 公司名称固定几个
*/
public static final String[] COMPANY_NAMES = {"外企人力资源公司", "中智人力资源公司", "新绿人力资源公司", "东浩人力资源公司"};
public static class Tag {
/**
* 自然流量标签
*/
public static final Integer NATURE = 1;
/**
* 拒绝流量标签
*/
public static final Integer REJECT = 2;
}
}
......@@ -48,6 +48,12 @@ public class NiwodaiIncomingRequestVO implements Serializable {
*/
private NiwodaiCostant.CreditRefData creditRefData;
/**
* 渠道风控信息,用与联合建模
* 1-自然流量,2-拒绝流量
*/
private Integer channelRiskData;
public Map<String,Object> toMap(){
return JSONObject.parseObject(JSON.toJSONString(this));
}
......
......@@ -32,5 +32,5 @@ public class NiwodaiIncomingResultResponseVO implements Serializable {
/**
* 额度有效期
*/
private Date validBefore;
private String validBefore;
}
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, null);
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.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
......@@ -27,4 +28,14 @@ public class DateUtil {
public static String getCurDateTime() {
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();
}
}
......@@ -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}"/>
<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">
<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>
<maxHistory>7</maxHistory>
</rollingPolicy>
......
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