Commit 0c5d8d94 authored by liwenbin's avatar liwenbin

fix

parent 14f71cb0
package com.quantgroup.asset.distribution.enums;
import lombok.Getter;
public enum ExecuteType {
TEST(0, "测试"),
ONLINE(1, "线上");
@Getter
private int code;
@Getter
private String description;
ExecuteType(int code, String description) {
this.code = code;
this.description = description;
}
}
...@@ -49,6 +49,8 @@ public class AssetForm implements Serializable{ ...@@ -49,6 +49,8 @@ public class AssetForm implements Serializable{
private int repeatCount = 0; private int repeatCount = 0;
private String refuseReason;
public Asset transToAsset() { public Asset transToAsset() {
Asset asset = new Asset(); Asset asset = new Asset();
asset.setAssetNo(this.assetNo); asset.setAssetNo(this.assetNo);
......
...@@ -4,6 +4,8 @@ import java.lang.reflect.Field; ...@@ -4,6 +4,8 @@ import java.lang.reflect.Field;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
...@@ -17,6 +19,7 @@ import com.alibaba.fastjson.JSONArray; ...@@ -17,6 +19,7 @@ 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;
...@@ -65,6 +68,8 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -65,6 +68,8 @@ public class AssetServiceImpl implements IAssetService{
@Autowired @Autowired
private IFinanceProductHitLogService financeProductHitLogService; private IFinanceProductHitLogService financeProductHitLogService;
private static final ExecutorService executorPool = Executors.newFixedThreadPool(100);
@Async @Async
@Override @Override
...@@ -81,8 +86,12 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -81,8 +86,12 @@ 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);
// 如果使用资方模块则去命中资方,创建金融产品集 // 如果使用资方模块则去命中资方,创建金融产品集
hitFundIfUseFundModule(assetForm, data); String hitFinanceProduct = hitFundIfUseFundModule(assetForm, data);
// 资方模块结果处理
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(),
...@@ -211,10 +220,10 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -211,10 +220,10 @@ public class AssetServiceImpl implements IAssetService{
* 如果使用资方模块,需要去命中资方 * 如果使用资方模块,需要去命中资方
* @param assetForm * @param assetForm
*/ */
public void hitFundIfUseFundModule(AssetForm assetForm, Map<String, Object> data) { public String hitFundIfUseFundModule(AssetForm assetForm, Map<String, Object> data) {
// 如果auditResult为true, amount或term有一个为空, 那就不管是否是测试,都不能使用资方模块了 // 如果auditResult为true, amount或term有一个为空, 那就不管是否是测试,都不能使用资方模块了
if ("true".equals(assetForm.getAuditResult()) && (StringUtils.isEmpty(assetForm.getAmount()) || StringUtils.isEmpty(assetForm.getTerm()))) { if ("true".equals(assetForm.getAuditResult()) && (StringUtils.isEmpty(assetForm.getAmount()) || StringUtils.isEmpty(assetForm.getTerm()))) {
return; return null;
} }
// 创建金融产品集,并初始化金额期数 // 创建金融产品集,并初始化金额期数
JSONArray financeProductArray = new JSONArray(); JSONArray financeProductArray = new JSONArray();
...@@ -245,9 +254,13 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -245,9 +254,13 @@ public class AssetServiceImpl implements IAssetService{
if (CollectionUtils.isNotEmpty(limits)) { if (CollectionUtils.isNotEmpty(limits)) {
for (ChannelFundConfig.Limit limit : limits) { for (ChannelFundConfig.Limit limit : limits) {
String expression = limit.getLimit(); String expression = limit.getLimit();
if (expression.contains("auditResult")) { if (expression.contains("audit_result")) {
hasAuditResultLimit = true; hasAuditResultLimit = true;
} }
// 如果是拒绝原因判断并且没有配置拒绝原因,不满足
if (expression.contains("refuseReason") && data.get("refuseReason") == null) {
continue A;
}
if (!ruleService.valid(expression, data)) { if (!ruleService.valid(expression, data)) {
continue A; continue A;
} }
...@@ -274,7 +287,7 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -274,7 +287,7 @@ public class AssetServiceImpl implements IAssetService{
// 如果审核拒绝,也没命中任何资方, 直接返回 // 如果审核拒绝,也没命中任何资方, 直接返回
if ("false".equals(assetForm.getAuditResult()) && fundArray.size() == 0) { if ("false".equals(assetForm.getAuditResult()) && fundArray.size() == 0) {
return; return null;
} }
QGPreconditions.checkArgument(fundArray.size() != 0, QGExceptionType.NO_FUND_INFO_BEEN_HIT, assetForm.getBizChannel(), assetForm.getAmount(), assetForm.getTerm()); QGPreconditions.checkArgument(fundArray.size() != 0, QGExceptionType.NO_FUND_INFO_BEEN_HIT, assetForm.getBizChannel(), assetForm.getAmount(), assetForm.getTerm());
...@@ -293,18 +306,72 @@ public class AssetServiceImpl implements IAssetService{ ...@@ -293,18 +306,72 @@ public class AssetServiceImpl implements IAssetService{
} }
String hitFinanceProduct = JSON.toJSONString(financeProductArray); String hitFinanceProduct = JSON.toJSONString(financeProductArray);
log.info("资方模块组成金融产品集完成, uuid : {}, assetNo : {}, bizNo : {}, bizChannel : {}, financeProduct : {}", assetForm.getUuid(), assetForm.getAssetNo(), assetForm.getBizNo(), assetForm.getBizChannel(), hitFinanceProduct); log.info("资方模块组成金融产品集完成, uuid : {}, assetNo : {}, bizNo : {}, bizChannel : {}, financeProduct : {}", assetForm.getUuid(), assetForm.getAssetNo(), assetForm.getBizNo(), assetForm.getBizChannel(), hitFinanceProduct);
// 如果金融产品集为空, 那就用hit的, 保证流程不会出错,并且没有比较 return hitFinanceProduct;
if (StringUtils.isEmpty(assetForm.getFinanceProducts())) { }
// 装填金融产品集并返回
assetForm.setFinanceProducts(hitFinanceProduct); /**
} else { * 资方模块命中后结果处理
String oldFinanceProduct = assetForm.getFinanceProducts(); * @param assetForm
// 原金融产品集不为空,如果不是测试,直接返回 * @param hitFinanceProduct
if (config.getType() == 1) { * @return
// 线上需要使用 */
assetForm.setFinanceProducts(hitFinanceProduct); private AssetForm checkFundResult(AssetForm assetForm, String hitFinanceProduct) {
} if (hitFinanceProduct == null) {
financeProductHitLogService.saveLog(assetForm, oldFinanceProduct, hitFinanceProduct); 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);
return assetForm;
}
/**
* 资方配置空跑
* @param testAssetForm
* @param data
*/
private void doTestExecute(AssetForm assetForm, Map<String, Object> data) {
executorPool.execute(() -> {
try {
assetForm.setBizChannel("88888_" + assetForm.getBizChannel());
String hitFundPro = hitFundIfUseFundModule(assetForm, data);
String oldFundPro = assetForm.getFinanceProducts();
String oldAuditResult = assetForm.getAuditResult();
if (hitFundPro != null) {
assetForm.setFinanceProducts(hitFundPro);
if ("false".equals(assetForm.getAuditResult())) {
assetForm.setAuditResult("true");
}
}
financeProductHitLogService.saveLog(assetForm, oldFundPro, hitFundPro, oldAuditResult, assetForm.getAuditResult(), ExecuteType.TEST);
} catch (QGException qe) {
log.error("资方配置执行空跑出现错误 : {}, uuid : {}, bizChannel : {}, bizType : {}, bizNo : {}, assetNo : {} ",
qe.qgExceptionType.code + "->" + qe.detail, assetForm.getUuid(),
assetForm.getBizChannel(), assetForm.getBizType(),
assetForm.getBizNo(), assetForm.getAssetNo());
alarmService.dingtalkAlarm("Warn", "资方配置执行空跑出现错误", "bizChannel : " + assetForm.getBizChannel()
+ " , bizType : " + assetForm.getBizType() + " , bizNo : " + assetForm.getBizNo()
+ " , assetNo : " + assetForm.getAssetNo() + " , uuid : " + assetForm.getUuid()
+ " , 错误信息 : " + qe.qgExceptionType.code + "->" + qe.detail);
} catch (Exception ex) {
log.error("资方配置执行空跑出现异常, uuid : {}, bizChannel : {}, bizType : {}, bizNo : {}, assetNo : {} ", assetForm.getUuid(),
assetForm.getBizChannel(), assetForm.getBizType(),
assetForm.getBizNo(), assetForm.getAssetNo(), ex);
alarmService.dingtalkAlarm("Warn", "资方配置执行空跑出现异常", "bizChannel : " + assetForm.getBizChannel()
+ " , bizType : " + assetForm.getBizType() + " , bizNo : " + assetForm.getBizNo()
+ " , assetNo : " + assetForm.getAssetNo() + " , uuid : " + assetForm.getUuid()
+ " , 错误信息 : 未知错误.");
}
});
} }
} }
...@@ -52,12 +52,21 @@ public class FinanceProductHitLog implements Serializable{ ...@@ -52,12 +52,21 @@ public class FinanceProductHitLog implements Serializable{
@Column(name = "new_finance_product") @Column(name = "new_finance_product")
private String newFinanceProduct; private String newFinanceProduct;
@Column(name = "old_audit_result")
private String oldAuditResult;
@Column(name = "new_audit_result")
private String newAuditResult;
@Column(name = "equals") @Column(name = "equals")
private Boolean equals; private Boolean equals;
@Column(name = "enable") @Column(name = "enable")
private Boolean enable; private Boolean enable;
@Column(name = "execute_type")
private Integer executeType;
@Column(name = "created_at") @Column(name = "created_at")
private Timestamp createdAt; private Timestamp createdAt;
......
package com.quantgroup.asset.distribution.service.product; package com.quantgroup.asset.distribution.service.product;
import com.quantgroup.asset.distribution.enums.ExecuteType;
import com.quantgroup.asset.distribution.model.form.AssetForm; import com.quantgroup.asset.distribution.model.form.AssetForm;
/** /**
...@@ -15,5 +16,6 @@ public interface IFinanceProductHitLogService { ...@@ -15,5 +16,6 @@ public interface IFinanceProductHitLogService {
* @param oldFinanceProduct * @param oldFinanceProduct
* @param newFinanceProduct * @param newFinanceProduct
*/ */
public void saveLog(AssetForm assetForm, String oldFinanceProduct, String newFinanceProduct); public void saveLog(AssetForm assetForm, String oldFinanceProduct, String newFinanceProduct,
String oldAuditResult, String newAuditResult, ExecuteType executeType);
} }
...@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service; ...@@ -13,6 +13,7 @@ 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.quantgroup.asset.distribution.enums.ExecuteType;
import com.quantgroup.asset.distribution.model.form.AssetForm; import com.quantgroup.asset.distribution.model.form.AssetForm;
import com.quantgroup.asset.distribution.service.jpa.entity.FinanceProductHitLog; import com.quantgroup.asset.distribution.service.jpa.entity.FinanceProductHitLog;
import com.quantgroup.asset.distribution.service.jpa.repository.IFinanceProductHitLogRepository; import com.quantgroup.asset.distribution.service.jpa.repository.IFinanceProductHitLogRepository;
...@@ -34,7 +35,8 @@ public class FinanceProductHitLogServiceImpl implements IFinanceProductHitLogSer ...@@ -34,7 +35,8 @@ public class FinanceProductHitLogServiceImpl implements IFinanceProductHitLogSer
@Async @Async
@Override @Override
public void saveLog(AssetForm assetForm, String oldFinanceProduct, String newFinanceProduct) { public void saveLog(AssetForm assetForm, String oldFinanceProduct, String newFinanceProduct,
String oldAuditResult, String newAuditResult, ExecuteType executeType) {
try { try {
FinanceProductHitLog hitLog = new FinanceProductHitLog(); FinanceProductHitLog hitLog = new FinanceProductHitLog();
hitLog.setBizChannel(assetForm.getBizChannel()); hitLog.setBizChannel(assetForm.getBizChannel());
...@@ -43,8 +45,11 @@ public class FinanceProductHitLogServiceImpl implements IFinanceProductHitLogSer ...@@ -43,8 +45,11 @@ public class FinanceProductHitLogServiceImpl implements IFinanceProductHitLogSer
hitLog.setBizNo(assetForm.getBizNo()); hitLog.setBizNo(assetForm.getBizNo());
hitLog.setOldFinanceProduct(oldFinanceProduct); hitLog.setOldFinanceProduct(oldFinanceProduct);
hitLog.setNewFinanceProduct(newFinanceProduct); hitLog.setNewFinanceProduct(newFinanceProduct);
hitLog.setOldAuditResult(oldAuditResult);
hitLog.setNewAuditResult(newAuditResult);
hitLog.setEnable(true); hitLog.setEnable(true);
hitLog.setEquals(financeProducEquals(oldFinanceProduct, newFinanceProduct)); hitLog.setEquals(financeProducEquals(oldFinanceProduct, newFinanceProduct));
hitLog.setExecuteType(executeType.getCode());
financeProductHitLogRepository.save(hitLog); financeProductHitLogRepository.save(hitLog);
} catch (Exception e) { } catch (Exception e) {
log.error("金融产品集命中记录比较保存异常, uuid : {}, bizNo : {}, assetNo : {}, oldFInanceProduct : {}, newFinanceProduct : {}", log.error("金融产品集命中记录比较保存异常, uuid : {}, bizNo : {}, assetNo : {}, oldFInanceProduct : {}, newFinanceProduct : {}",
......
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