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); } }