package com.jttech.cmci.pfcs.service;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.jttech.cmci.pfcs.util.DateUtil;
|
import com.jttech.cmci.pfcs.vo.UserInfoVo;
|
import com.jttech.cmci.pfcs.vo.req.ZxmxGetScoreReqVo;
|
import com.jttech.cmci.pfcs.vo.resp.ZxmxGetScoreRespVo;
|
import com.jttech.cmci.pfcs.content.ZxmxContent;
|
import com.jttech.cmci.pfcs.util.XmlUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.StringUtils;
|
|
import java.math.BigDecimal;
|
import java.util.Date;
|
|
/**
|
* @Description:征信模型加工
|
* @Author:carsonwang
|
* @Date:Created in 2022-04-06 14:39
|
* @Version: 1.0
|
*/
|
@Service
|
public class ZxmxManagerService {
|
private Logger mLogger = LoggerFactory.getLogger(getClass());
|
|
|
|
public ZxmxGetScoreRespVo getScore(ZxmxGetScoreReqVo pReqVo) {
|
mLogger.info("请求报文:{}", pReqVo);
|
JSONObject creditInfo = XmlUtils.xml2Json(pReqVo.getZxData());
|
creditInfo = creditInfo.getJSONObject(ZxmxContent.reportMessage);
|
// 获取用户信息
|
UserInfoVo userInfo = getUserInfo(creditInfo);
|
mLogger.info("=================征信模型加工开始,当前用户为:{}=================", userInfo);
|
// 获取逾期总金额(被追偿信息债权金额+非循环贷账户当前逾期总额+循环额度下分账户当前逾期总额+循环贷账户当前逾期总额+贷记卡账户当前逾期总额)
|
Integer overdueTotal = getOverdueTotal(userInfo, creditInfo);
|
// 获取贷记卡授信总额度(所有贷记卡授信金额求和)
|
Integer creditLines = getCreditLines(userInfo, creditInfo);
|
// 获取近六个月平均应还款额
|
Integer avgUsedOfSixMonth = getAvgUsedOfSixMonth(userInfo, creditInfo);
|
// 获取近一年逾期次数
|
Integer overdueNumOfYear = getOverdueNumOfYear(userInfo, creditInfo);
|
// 获取近一年查征次数
|
Integer queryNumOfYear = getQueryNumOfYear(userInfo, creditInfo);
|
ZxmxGetScoreRespVo respVo = new ZxmxGetScoreRespVo(overdueTotal, creditLines, avgUsedOfSixMonth,
|
overdueNumOfYear, queryNumOfYear);
|
mLogger.info("=================征信模型加工结束,当前用户为:{},加工结果为:{}=================", userInfo, respVo);
|
return respVo;
|
}
|
|
|
|
/**
|
* 获取用户信息
|
*
|
* @param pCreditInfo
|
* @return
|
*/
|
private UserInfoVo getUserInfo(JSONObject pCreditInfo) {
|
JSONObject reportHead = getJsonObject(pCreditInfo, ZxmxContent.ReportHead);
|
JSONObject thisQueryReqInfo = getJsonObject(reportHead, ZxmxContent.ThisQueryReqInfo);
|
String username = thisQueryReqInfo.getString(ZxmxContent.QueryName);
|
String idNo = thisQueryReqInfo.getString(ZxmxContent.QueryCredNum);
|
UserInfoVo userInfo = new UserInfoVo(username, idNo);
|
return userInfo;
|
}
|
|
|
|
/**
|
* 近一年查征次数(根据查征记录中近一年查询次数计算)
|
*
|
* @param pCreditInfo
|
* @return
|
*/
|
private Integer getQueryNumOfYear(UserInfoVo userInfo, JSONObject pCreditInfo) {
|
Integer totalQueryNumOfYear = 0;
|
JSONArray queryInfos = pCreditInfo.getJSONArray(ZxmxContent.QueryInfo);
|
if (!CollectionUtils.isEmpty(queryInfos)) {
|
Date currTime = DateUtil.getDayEndTime(new Date());
|
Date yearTime = DateUtil.addYear(currTime, -1);
|
for (Object obj : queryInfos) {
|
if (obj != null) {
|
JSONObject queryInfo = (JSONObject) obj;
|
String queryDateStr = queryInfo.getString(ZxmxContent.QueryDate);
|
if (!StringUtils.isEmpty(queryDateStr)) {
|
Date queryDate = DateUtil.parseDate(DateUtil.pattern[2], queryDateStr);
|
if (queryDate.after(yearTime) && queryDate.before(currTime)) {
|
totalQueryNumOfYear++;
|
}
|
}
|
}
|
}
|
}
|
// 获取近一年查征次数
|
Integer queryNumOfYear = getQueryNumOfYear(totalQueryNumOfYear);
|
mLogger.info("==========================用户:{},近一年查询征信总数为:{},评级为:{}=======================", userInfo,
|
totalQueryNumOfYear, queryNumOfYear);
|
return queryNumOfYear;
|
}
|
|
|
|
/**
|
* 获取近一年查征次数 评级 0 0 1 (0,5] 2 (5,10] 3 (10,15] 4 (15,20] 5 (20,25] 6 (25,30]
|
* 7 (30,35] 8 (35,40] 9 >40
|
*
|
* @param pTotalQueryNumOfYear
|
* @return
|
*/
|
private Integer getQueryNumOfYear(Integer pTotalQueryNumOfYear) {
|
Integer queryNumOfYear = 0;
|
if (pTotalQueryNumOfYear == 0) {
|
queryNumOfYear = 0;
|
} else if (pTotalQueryNumOfYear > 0 && pTotalQueryNumOfYear <= 5) {
|
queryNumOfYear = 1;
|
} else if (pTotalQueryNumOfYear > 5 && pTotalQueryNumOfYear <= 10) {
|
queryNumOfYear = 2;
|
} else if (pTotalQueryNumOfYear > 10 && pTotalQueryNumOfYear <= 15) {
|
queryNumOfYear = 3;
|
} else if (pTotalQueryNumOfYear > 15 && pTotalQueryNumOfYear <= 20) {
|
queryNumOfYear = 4;
|
} else if (pTotalQueryNumOfYear > 20 && pTotalQueryNumOfYear <= 25) {
|
queryNumOfYear = 5;
|
} else if (pTotalQueryNumOfYear > 25 && pTotalQueryNumOfYear <= 30) {
|
queryNumOfYear = 6;
|
} else if (pTotalQueryNumOfYear > 30 && pTotalQueryNumOfYear <= 35) {
|
queryNumOfYear = 7;
|
} else if (pTotalQueryNumOfYear > 35 && pTotalQueryNumOfYear <= 40) {
|
queryNumOfYear = 8;
|
} else if (pTotalQueryNumOfYear > 40) {
|
queryNumOfYear = 9;
|
}
|
return queryNumOfYear;
|
}
|
|
|
|
/**
|
* 近一年逾期次数("非循环贷账户/循环额度下分账户/循环贷账户/贷记卡账户/准贷记卡账户 账户中近一年还款月中为逾期的总次数")
|
*
|
* @param pCreditInfo
|
* @return
|
*/
|
private Integer getOverdueNumOfYear(UserInfoVo userInfo, JSONObject pCreditInfo) {
|
JSONObject creditTranDetailsInfo = getJsonObject(pCreditInfo, ZxmxContent.creditTranDetailsInfo);
|
if (creditTranDetailsInfo == null) {
|
return -1;
|
}
|
// 6.4.2 非循环贷账户 D1【NonrevolvingLoanDetInfo】
|
JSONArray nonrevolvingLoanDetInfos = creditTranDetailsInfo.getJSONArray(ZxmxContent.nonrevolvingLoanDetInfo);
|
// 6.4.2.4 最近五年内历史表现信息【Last5YearsHisPerFmInfo】 content
|
Integer nonrevolvingOverdueNum = 0;
|
if (!CollectionUtils.isEmpty(nonrevolvingLoanDetInfos)) {
|
for (Object obj : nonrevolvingLoanDetInfos) {
|
if (obj != null) {
|
JSONObject nonrevolvingLoanDetInfo = (JSONObject) obj;
|
JSONObject last5YearsHisPerFmInfo = getJsonObject(nonrevolvingLoanDetInfo,
|
ZxmxContent.Last5YearsHisPerFmInfo);
|
if (last5YearsHisPerFmInfo != null) {
|
nonrevolvingOverdueNum = nonrevolvingOverdueNum + getOverdueNum(last5YearsHisPerFmInfo);
|
}
|
}
|
}
|
}
|
mLogger.info("非循环贷账户,最近五年内历史表现信息,逾期次数:{}", nonrevolvingOverdueNum);
|
// 6.4.3 循环额度下分账户 R4【LoopQuotaSubAct】
|
JSONArray loopQuotaSubActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.LoopQuotaSubAct);
|
// 6.4.3.4最近五年内历史表现信息【Last5YearsHisPerfmInfo】 content
|
Integer loopOverdueNum = 0;
|
if (!CollectionUtils.isEmpty(loopQuotaSubActs)) {
|
for (Object obj : loopQuotaSubActs) {
|
if (obj != null) {
|
JSONObject loopQuotaSubAct = (JSONObject) obj;
|
JSONObject last5YearsHisPerFmInfo = getJsonObject(loopQuotaSubAct,
|
ZxmxContent.Last5YearsHisPerFmInfo);
|
if (last5YearsHisPerFmInfo != null) {
|
loopOverdueNum = loopOverdueNum + getOverdueNum(last5YearsHisPerFmInfo);
|
}
|
}
|
}
|
}
|
mLogger.info("循环额度下分账户,最近五年内历史表现信息,逾期次数:{}", loopOverdueNum);
|
// 6.4.4 循环贷账户 R1【RevolvinLoanAct】
|
JSONArray revolvinLoanActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.RevolvinLoanAct);
|
// 6.4.4.4最近五年内历史表现信息【Last5YearsHisPerfmInfo】 content
|
Integer revolvinOverdueNum = 0;
|
if (!CollectionUtils.isEmpty(revolvinLoanActs)) {
|
for (Object obj : revolvinLoanActs) {
|
if (obj != null) {
|
JSONObject revolvinLoanAct = (JSONObject) obj;
|
JSONObject last5YearsHisPerFmInfo = getJsonObject(revolvinLoanAct,
|
ZxmxContent.Last5YearsHisPerFmInfo);
|
if (last5YearsHisPerFmInfo != null) {
|
revolvinOverdueNum = revolvinOverdueNum + getOverdueNum(last5YearsHisPerFmInfo);
|
}
|
}
|
}
|
}
|
mLogger.info("循环贷账户,最近五年内历史表现信息,逾期次数:{}", revolvinOverdueNum);
|
// 6.4.5 贷记卡账户 R2【CreditCardAct】
|
JSONArray creditCardActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.CreditCardAct);
|
// 6.4.5.5最近五年内历史表现信息【Last5YearsHisPerfmInfo】 content
|
Integer creditCardOverdueNum = 0;
|
if (!CollectionUtils.isEmpty(creditCardActs)) {
|
for (Object obj : creditCardActs) {
|
if (obj != null) {
|
JSONObject creditCardAct = (JSONObject) obj;
|
JSONObject last5YearsHisPerFmInfo = getJsonObject(creditCardAct,
|
ZxmxContent.Last5YearsHisPerFmInfo);
|
if (last5YearsHisPerFmInfo != null) {
|
creditCardOverdueNum = creditCardOverdueNum + getOverdueNum(last5YearsHisPerFmInfo);
|
}
|
}
|
}
|
}
|
mLogger.info("贷记卡账户,最近五年内历史表现信息,逾期次数:{}", creditCardOverdueNum);
|
// 6.4.6 准贷记卡账户 R3【SemiCreditCardAct】
|
JSONArray semiCreditCardActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.SemiCreditCardAct);
|
// 6.4.6.4最近五年内历史表现信息【Last5YearsHisPerfmInfo】 content
|
Integer semiCreditCardOverdueNum = 0;
|
if (!CollectionUtils.isEmpty(semiCreditCardActs)) {
|
for (Object obj : semiCreditCardActs) {
|
if (obj != null) {
|
JSONObject semiCreditCardAct = (JSONObject) obj;
|
JSONObject last5YearsHisPerFmInfo = getJsonObject(semiCreditCardAct,
|
ZxmxContent.Last5YearsHisPerFmInfo);
|
if (last5YearsHisPerFmInfo != null) {
|
semiCreditCardOverdueNum = semiCreditCardOverdueNum + getOverdueNum(last5YearsHisPerFmInfo);
|
}
|
}
|
}
|
}
|
mLogger.info("准贷记卡账户,最近五年内历史表现信息,逾期次数:{}", semiCreditCardOverdueNum);
|
Integer totalOverdueNum = nonrevolvingOverdueNum + loopOverdueNum + revolvinOverdueNum + creditCardOverdueNum
|
+ semiCreditCardOverdueNum;
|
Integer overdueNumOfYear = getOverdueNumOfYear(totalOverdueNum);
|
mLogger.info("==========================用户:{},近一年逾期次数总数:{},评级为:{}=======================", userInfo,
|
totalOverdueNum, overdueNumOfYear);
|
return overdueNumOfYear;
|
}
|
|
|
|
/**
|
* 近一年逾期次数 评级 0 0 1 (0,5] 2 (5,10] 3 (10,15] 4 (15,20] 5 (20,25] 6 (25,30] 7
|
* (30,35] 8 (35,40] 9 >40
|
*
|
* @param pTotalOverdueNum
|
* @return
|
*/
|
private Integer getOverdueNumOfYear(Integer pTotalOverdueNum) {
|
Integer overdueNumOfYear = 0;
|
if (pTotalOverdueNum == 0) {
|
overdueNumOfYear = 0;
|
} else if (pTotalOverdueNum > 0 && pTotalOverdueNum <= 5) {
|
overdueNumOfYear = 1;
|
} else if (pTotalOverdueNum > 5 && pTotalOverdueNum <= 10) {
|
overdueNumOfYear = 2;
|
} else if (pTotalOverdueNum > 10 && pTotalOverdueNum <= 15) {
|
overdueNumOfYear = 3;
|
} else if (pTotalOverdueNum > 15 && pTotalOverdueNum <= 20) {
|
overdueNumOfYear = 4;
|
} else if (pTotalOverdueNum > 20 && pTotalOverdueNum <= 25) {
|
overdueNumOfYear = 5;
|
} else if (pTotalOverdueNum > 25 && pTotalOverdueNum <= 30) {
|
overdueNumOfYear = 6;
|
} else if (pTotalOverdueNum > 30 && pTotalOverdueNum <= 35) {
|
overdueNumOfYear = 7;
|
} else if (pTotalOverdueNum > 35 && pTotalOverdueNum <= 40) {
|
overdueNumOfYear = 8;
|
} else if (pTotalOverdueNum > 40) {
|
overdueNumOfYear = 9;
|
}
|
return overdueNumOfYear;
|
}
|
|
|
|
/**
|
* 各个账户明细还款记录,从最后一个还款日往前推12个还款日,还款记录 近一年非*且非n且非m且非c次数之和
|
*
|
* @param pLast5YearsHisPerFmInfo
|
* @return
|
*/
|
private Integer getOverdueNum(JSONObject pLast5YearsHisPerFmInfo) {
|
Integer overdueNum = 0;
|
String content = pLast5YearsHisPerFmInfo.getString(ZxmxContent.Content);
|
if (!StringUtils.isEmpty(content)) {
|
String[] repayInfos = content.split(ZxmxContent.VERTICAL_LINE);
|
for (int i = 0; i < 12; i++) {
|
// 如果索引大于长度,直接跳出循环
|
if (i > repayInfos.length - 1) {
|
break;
|
}
|
String repayInfo = repayInfos[i];
|
if (!(repayInfo.startsWith("*") || repayInfo.startsWith("N") || repayInfo.startsWith("M")
|
|| repayInfo.startsWith("C"))) {
|
overdueNum++;
|
}
|
}
|
}
|
return overdueNum;
|
}
|
|
|
|
/**
|
* 近六个月平均应还款额(信贷交易授信及负债信息概要
|
* :非循环贷账户信息汇总-最近6个月平均应还款+循环额度下分账户信息汇总-最近6个月平均应还款+循环贷账户信息汇总-最近6个月平均应还+
|
* 贷记卡账户信息汇总-最近6个月平均使用额度+准贷记卡账户信息汇总-最近6个月平均透支余额)
|
*
|
* @param pCreditInfo
|
* @return
|
*/
|
private Integer getAvgUsedOfSixMonth(UserInfoVo userInfo, JSONObject pCreditInfo) {
|
JSONObject creditTranDetailsInfo = getJsonObject(pCreditInfo, ZxmxContent.creditTranDetailsInfo);
|
if (creditTranDetailsInfo == null) {
|
return -1;
|
}
|
// 非循环贷账户信息汇总 - 6.4.2.3 最近一次月度表现信息 最近 6 个月平均使用额度
|
BigDecimal nonrevolvingAvgUsedOfSixMonth = BigDecimal.ZERO;
|
JSONArray nonrevolvingLoanDetInfos = creditTranDetailsInfo.getJSONArray(ZxmxContent.nonrevolvingLoanDetInfo);
|
if (!CollectionUtils.isEmpty(nonrevolvingLoanDetInfos)) {
|
for (Object obj : nonrevolvingLoanDetInfos) {
|
if (obj != null) {
|
JSONObject nonrevolvingLoanDetInfo = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(nonrevolvingLoanDetInfo,
|
ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
nonrevolvingAvgUsedOfSixMonth = nonrevolvingAvgUsedOfSixMonth
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.avgUsedOfSixMonth));
|
}
|
}
|
}
|
}
|
mLogger.info("非循环贷账户信息汇总 - 最近一次月度表现信息 最近 6 个月平均使用额度:{}", nonrevolvingAvgUsedOfSixMonth);
|
// 循环额度下分账户信息汇总 - 6.4.3.3 最近一次月度表现信息 最近 6 个月平均使用额度
|
BigDecimal loopAvgUsedOfSixMonth = BigDecimal.ZERO;
|
JSONArray loopQuotaSubActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.LoopQuotaSubAct);
|
if (!CollectionUtils.isEmpty(loopQuotaSubActs)) {
|
for (Object obj : loopQuotaSubActs) {
|
if (obj != null) {
|
JSONObject loopQuotaSubAct = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(loopQuotaSubAct, ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
loopAvgUsedOfSixMonth = loopAvgUsedOfSixMonth
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.avgUsedOfSixMonth));
|
}
|
}
|
}
|
}
|
mLogger.info("循环额度下分账户信息汇总 - 最近一次月度表现信息 最近 6 个月平均使用额度:{}", loopAvgUsedOfSixMonth);
|
// 循环贷账户信息汇总 - 6.4.4.3 最近一次月度表现信息 最近 6 个月平均使用额度
|
BigDecimal revolvinAvgUsedOfSixMonth = BigDecimal.ZERO;
|
JSONArray revolvinLoanActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.RevolvinLoanAct);
|
if (!CollectionUtils.isEmpty(revolvinLoanActs)) {
|
for (Object obj : revolvinLoanActs) {
|
if (obj != null) {
|
JSONObject revolvinLoanAct = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(revolvinLoanAct, ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
revolvinAvgUsedOfSixMonth = revolvinAvgUsedOfSixMonth
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.avgUsedOfSixMonth));
|
}
|
}
|
}
|
}
|
mLogger.info("循环贷账户信息汇总 - 最近一次月度表现信息 最近 6 个月平均使用额度:{}", revolvinAvgUsedOfSixMonth);
|
// 贷记卡账户信息汇总 - 6.4.5.3 最近一次月度表现信息 最近 6 个月平均使用额度
|
BigDecimal creditCardAvgUsedOfSixMonth = BigDecimal.ZERO;
|
JSONArray creditCardActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.CreditCardAct);
|
if (!CollectionUtils.isEmpty(creditCardActs)) {
|
for (Object obj : creditCardActs) {
|
if (obj != null) {
|
JSONObject creditCardAct = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(creditCardAct, ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
creditCardAvgUsedOfSixMonth = creditCardAvgUsedOfSixMonth
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.avgUsedOfSixMonth));
|
}
|
}
|
}
|
}
|
mLogger.info("贷记卡账户信息汇总 - 最近一次月度表现信息 最近 6 个月平均使用额度:{}", creditCardAvgUsedOfSixMonth);
|
// 准贷记卡账户信息汇总 - 6.4.6.3 最近一次月度表现信息 最近 6 个月平均使用额度
|
BigDecimal semiCreditCardAvgUsedOfSixMonth = BigDecimal.ZERO;
|
JSONArray semiCreditCardActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.SemiCreditCardAct);
|
if (!CollectionUtils.isEmpty(semiCreditCardActs)) {
|
for (Object obj : semiCreditCardActs) {
|
if (obj != null) {
|
JSONObject semiCreditCardAct = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(semiCreditCardAct, ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
semiCreditCardAvgUsedOfSixMonth = semiCreditCardAvgUsedOfSixMonth
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.avgUsedOfSixMonth));
|
}
|
}
|
}
|
}
|
mLogger.info("准贷记卡账户信息汇总 - 最近一次月度表现信息 最近 6 个月平均使用额度:{}", semiCreditCardAvgUsedOfSixMonth);
|
BigDecimal totalAvgUsedOfSixMonth = nonrevolvingAvgUsedOfSixMonth.add(loopAvgUsedOfSixMonth)
|
.add(revolvinAvgUsedOfSixMonth).add(creditCardAvgUsedOfSixMonth).add(semiCreditCardAvgUsedOfSixMonth);
|
// 获取近六个月平均应还款额
|
Integer avgUsedOfSixMonth = getAvgUsedOfSixMonth(totalAvgUsedOfSixMonth);
|
mLogger.info("==========================用户:{},近六个月平均应还款总额:{},评级为:{}======================", userInfo,
|
totalAvgUsedOfSixMonth, avgUsedOfSixMonth);
|
return avgUsedOfSixMonth;
|
}
|
|
|
|
/**
|
* 获取近六个月平均应还款额评级 0 0 1 (0,10000) 2 (10000,20000] 3 (20000,30000] 4
|
* (30000,40000] 5 (40000,50000] 6 (50000,60000] 7 (60000,70000] 8
|
* (70000,80000] 9 >80000
|
*
|
* @param pTotalAvgUsedOfSixMonth
|
* @return
|
*/
|
private Integer getAvgUsedOfSixMonth(BigDecimal pTotalAvgUsedOfSixMonth) {
|
Integer avgUsedOfSixMonth = 0;
|
if (pTotalAvgUsedOfSixMonth.compareTo(BigDecimal.ZERO) == 0) {
|
avgUsedOfSixMonth = 0;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(BigDecimal.ZERO) > 0
|
&& pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("10000")) <= 0) {
|
avgUsedOfSixMonth = 1;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("10000")) > 0
|
&& pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("20000")) <= 0) {
|
avgUsedOfSixMonth = 2;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("20000")) > 0
|
&& pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("30000")) <= 0) {
|
avgUsedOfSixMonth = 3;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("30000")) > 0
|
&& pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("40000")) <= 0) {
|
avgUsedOfSixMonth = 4;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("40000")) > 0
|
&& pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("50000")) <= 0) {
|
avgUsedOfSixMonth = 5;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("50000")) > 0
|
&& pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("60000")) <= 0) {
|
avgUsedOfSixMonth = 6;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("60000")) > 0
|
&& pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("70000")) <= 0) {
|
avgUsedOfSixMonth = 7;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("70000")) > 0
|
&& pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("80000")) <= 0) {
|
avgUsedOfSixMonth = 8;
|
} else if (pTotalAvgUsedOfSixMonth.compareTo(new BigDecimal("80000")) > 0) {
|
avgUsedOfSixMonth = 9;
|
}
|
return avgUsedOfSixMonth;
|
}
|
|
|
|
/**
|
* 所有贷记卡授信金额求和
|
*
|
* @param pCreditInfo
|
* @return
|
*/
|
private Integer getCreditLines(UserInfoVo userInfo, JSONObject pCreditInfo) {
|
JSONObject creditTranDetailsInfo = getJsonObject(pCreditInfo, ZxmxContent.creditTranDetailsInfo);
|
if (creditTranDetailsInfo == null) {
|
return -1;
|
}
|
BigDecimal lines = BigDecimal.ZERO;
|
JSONArray creditCardActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.CreditCardAct);
|
if (!CollectionUtils.isEmpty(creditCardActs)) {
|
for (Object obj : creditCardActs) {
|
JSONObject creditCardAct = (JSONObject) obj;
|
JSONObject baseInfo = getJsonObject(creditCardAct, ZxmxContent.baseInfo);
|
if (baseInfo != null) {
|
lines = lines.add(getAmount(baseInfo, ZxmxContent.Lines));
|
}
|
}
|
}
|
Integer creditLines = getCreditLines(lines);
|
mLogger.info("==========================用户:{},所有贷记卡授信金额:{},评级为:{}========================", userInfo, lines,
|
creditLines);
|
return creditLines;
|
}
|
|
|
|
/**
|
* 授信额度分级 0 0 1 (0,30000] 2 (30000,50000] 3 (50000,70000] 4 (70000,90000] 5
|
* (90000,110000] 6 (110000,130000] 7 (130000,150000] 8 (150000,200000] 9
|
* >200000
|
*
|
* @param lines
|
* @return
|
*/
|
private Integer getCreditLines(BigDecimal lines) {
|
Integer overdueTotal = 0;
|
if (lines.compareTo(BigDecimal.ZERO) == 0) {
|
overdueTotal = 0;
|
} else if (lines.compareTo(BigDecimal.ZERO) > 0 && lines.compareTo(new BigDecimal("30000")) <= 0) {
|
overdueTotal = 1;
|
} else if (lines.compareTo(new BigDecimal("30000")) > 0 && lines.compareTo(new BigDecimal("50000")) <= 0) {
|
overdueTotal = 2;
|
} else if (lines.compareTo(new BigDecimal("50000")) > 0 && lines.compareTo(new BigDecimal("70000")) <= 0) {
|
overdueTotal = 3;
|
} else if (lines.compareTo(new BigDecimal("70000")) > 0 && lines.compareTo(new BigDecimal("90000")) <= 0) {
|
overdueTotal = 4;
|
} else if (lines.compareTo(new BigDecimal("90000")) > 0 && lines.compareTo(new BigDecimal("110000")) <= 0) {
|
overdueTotal = 5;
|
} else if (lines.compareTo(new BigDecimal("110000")) > 0 && lines.compareTo(new BigDecimal("130000")) <= 0) {
|
overdueTotal = 6;
|
} else if (lines.compareTo(new BigDecimal("130000")) > 0 && lines.compareTo(new BigDecimal("150000")) <= 0) {
|
overdueTotal = 7;
|
} else if (lines.compareTo(new BigDecimal("150000")) > 0 && lines.compareTo(new BigDecimal("200000")) <= 0) {
|
overdueTotal = 8;
|
} else if (lines.compareTo(new BigDecimal("200000")) > 0) {
|
overdueTotal = 9;
|
}
|
return overdueTotal;
|
}
|
|
|
|
/**
|
* 获取逾期总金额(被追偿信息债权金额+非循环贷账户当前逾期总额+循环额度下分账户当前逾期总额+循环贷账户当前逾期总额+贷记卡账户当前逾期总额)
|
*
|
* @param pCreditInfo
|
* @return
|
*/
|
private Integer getOverdueTotal(UserInfoVo userInfo, JSONObject pCreditInfo) {
|
JSONObject creditTranDetailsInfo = getJsonObject(pCreditInfo, ZxmxContent.creditTranDetailsInfo);
|
if (creditTranDetailsInfo == null) {
|
return -1;
|
}
|
// 6.4.1.1 基本信息【BaseInfo】 Money 债权金额
|
BigDecimal money = BigDecimal.ZERO;
|
JSONObject beRecoveryDetailsInfo = getJsonObject(creditTranDetailsInfo, ZxmxContent.beRecoveryDetailsInfo);
|
if (beRecoveryDetailsInfo != null) {
|
JSONObject baseInfo = getJsonObject(beRecoveryDetailsInfo, ZxmxContent.baseInfo);
|
if (baseInfo != null) {
|
money = getAmount(baseInfo, ZxmxContent.money);
|
}
|
}
|
mLogger.info("被追偿信息债权金额,基本信息,债权金额:{}", money);
|
// 6.4.2.3 最近一次月度表现信息 CurrentOverdueTotal
|
BigDecimal nonrevolvingOverdueTotal = BigDecimal.ZERO;
|
JSONArray nonrevolvingLoanDetInfos = creditTranDetailsInfo.getJSONArray(ZxmxContent.nonrevolvingLoanDetInfo);
|
if (!CollectionUtils.isEmpty(nonrevolvingLoanDetInfos)) {
|
for (Object obj : nonrevolvingLoanDetInfos) {
|
if (obj != null) {
|
JSONObject nonrevolvingLoanDetInfo = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(nonrevolvingLoanDetInfo,
|
ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
nonrevolvingOverdueTotal = nonrevolvingOverdueTotal
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.currentOverdueTotal));
|
}
|
}
|
}
|
}
|
mLogger.info("非循环贷账户,最近一次月度表现信息,当前逾期总额:{}", nonrevolvingOverdueTotal);
|
// 6.4.3.3 最近一次月度表现信息 CurrentOverdueTotal
|
BigDecimal loopOverdueTotal = BigDecimal.ZERO;
|
JSONArray loopQuotaSubActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.LoopQuotaSubAct);
|
if (!CollectionUtils.isEmpty(loopQuotaSubActs)) {
|
for (Object obj : loopQuotaSubActs) {
|
if (obj != null) {
|
JSONObject loopQuotaSubAct = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(loopQuotaSubAct, ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
loopOverdueTotal = loopOverdueTotal
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.currentOverdueTotal));
|
}
|
}
|
}
|
}
|
mLogger.info("循环额度下分账户,最近一次月度表现信息,当前逾期总额:{}", loopOverdueTotal);
|
// 6.4.4.3 最近一次月度表现信息 CurrentOverdueTotal
|
BigDecimal revolvinOverdueTotal = BigDecimal.ZERO;
|
JSONArray revolvinLoanActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.RevolvinLoanAct);
|
if (!CollectionUtils.isEmpty(revolvinLoanActs)) {
|
for (Object obj : revolvinLoanActs) {
|
if (obj != null) {
|
JSONObject revolvinLoanAct = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(revolvinLoanAct, ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
revolvinOverdueTotal = revolvinOverdueTotal
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.currentOverdueTotal));
|
}
|
}
|
}
|
|
}
|
mLogger.info("循环贷账户,最近一次月度表现信息,当前逾期总额:{}", revolvinOverdueTotal);
|
// 6.4.5.3 最近一次月度表现信息 CurrentOverdueTotal
|
BigDecimal creditCardOverdueTotal = BigDecimal.ZERO;
|
JSONArray creditCardActs = creditTranDetailsInfo.getJSONArray(ZxmxContent.CreditCardAct);
|
if (!CollectionUtils.isEmpty(creditCardActs)) {
|
for (Object obj : creditCardActs) {
|
if (obj != null) {
|
JSONObject creditCardAct = (JSONObject) obj;
|
JSONObject latestMonPerfmInfo = getJsonObject(creditCardAct, ZxmxContent.latestMonPerfmInfo);
|
if (latestMonPerfmInfo != null) {
|
creditCardOverdueTotal = creditCardOverdueTotal
|
.add(getAmount(latestMonPerfmInfo, ZxmxContent.currentOverdueTotal));
|
}
|
}
|
}
|
}
|
mLogger.info("贷记卡账户,最近一次月度表现信息,当前逾期总额:{}", creditCardOverdueTotal);
|
BigDecimal totalOverdueTotal = money.add(nonrevolvingOverdueTotal).add(loopOverdueTotal)
|
.add(revolvinOverdueTotal).add(creditCardOverdueTotal);
|
Integer overdueTotal = getOverdueTotal(totalOverdueTotal);
|
mLogger.info("==========================用户:{},获取逾期总金额:{},评级:{}==========================", userInfo,
|
totalOverdueTotal, overdueTotal);
|
return overdueTotal;
|
}
|
|
|
|
/**
|
* 0 0 1 (0,10000) 2 (10000,20000] 3 (20000,30000] 4 (30000,40000] 5
|
* (40000,50000] 6 (50000,60000] 7 (60000,70000] 8 (70000,80000] 9 >80000
|
*
|
* @param totalOverdueTotal
|
* @return
|
*/
|
private Integer getOverdueTotal(BigDecimal totalOverdueTotal) {
|
Integer overdueTotal = 0;
|
if (totalOverdueTotal.compareTo(BigDecimal.ZERO) == 0) {
|
overdueTotal = 0;
|
} else if (totalOverdueTotal.compareTo(BigDecimal.ZERO) > 0
|
&& totalOverdueTotal.compareTo(new BigDecimal("10000")) <= 0) {
|
overdueTotal = 1;
|
} else if (totalOverdueTotal.compareTo(new BigDecimal("10000")) > 0
|
&& totalOverdueTotal.compareTo(new BigDecimal("20000")) <= 0) {
|
overdueTotal = 2;
|
} else if (totalOverdueTotal.compareTo(new BigDecimal("20000")) > 0
|
&& totalOverdueTotal.compareTo(new BigDecimal("30000")) <= 0) {
|
overdueTotal = 3;
|
} else if (totalOverdueTotal.compareTo(new BigDecimal("30000")) > 0
|
&& totalOverdueTotal.compareTo(new BigDecimal("40000")) <= 0) {
|
overdueTotal = 4;
|
} else if (totalOverdueTotal.compareTo(new BigDecimal("40000")) > 0
|
&& totalOverdueTotal.compareTo(new BigDecimal("50000")) <= 0) {
|
overdueTotal = 5;
|
} else if (totalOverdueTotal.compareTo(new BigDecimal("50000")) > 0
|
&& totalOverdueTotal.compareTo(new BigDecimal("60000")) <= 0) {
|
overdueTotal = 6;
|
} else if (totalOverdueTotal.compareTo(new BigDecimal("60000")) > 0
|
&& totalOverdueTotal.compareTo(new BigDecimal("70000")) <= 0) {
|
overdueTotal = 7;
|
} else if (totalOverdueTotal.compareTo(new BigDecimal("70000")) > 0
|
&& totalOverdueTotal.compareTo(new BigDecimal("80000")) <= 0) {
|
overdueTotal = 8;
|
} else if (totalOverdueTotal.compareTo(new BigDecimal("80000")) > 0) {
|
overdueTotal = 9;
|
}
|
return overdueTotal;
|
}
|
|
|
|
/**
|
* 获取金额
|
*
|
* @param pJsonObject
|
* @param pKeyName
|
* @return
|
*/
|
private BigDecimal getAmount(JSONObject pJsonObject, String pKeyName) {
|
mLogger.info("获取参数:{},在对象:{}的值", pKeyName, pJsonObject);
|
String num = pJsonObject.getString(pKeyName);
|
if (StringUtils.isEmpty(num)) {
|
return BigDecimal.ZERO;
|
}
|
return new BigDecimal(num.replaceAll(ZxmxContent.SIGN_COMMA, ZxmxContent.EMPTY_STR));
|
}
|
|
|
|
/**
|
* 获取json对象
|
*
|
* @param pJsonObject
|
* @param pKeyName
|
* @return
|
*/
|
private JSONObject getJsonObject(JSONObject pJsonObject, String pKeyName) {
|
mLogger.info("获取参数:{},在对象:{}的值", pKeyName, pJsonObject);
|
JSONArray jsonArray = pJsonObject.getJSONArray(pKeyName);
|
if (CollectionUtils.isEmpty(jsonArray)) {
|
return null;
|
}
|
return (JSONObject) jsonArray.get(0);
|
}
|
}
|