From 5378165da6ad9f748a8a3e4599743d0bfbb4835b Mon Sep 17 00:00:00 2001
From: wanghc <2466022993@qq.com>
Date: Fri, 03 Mar 2023 14:55:38 +0800
Subject: [PATCH] 浦发分行小系统
---
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/resp/ZxmxGetScoreRespVo.java | 125 +++
.gitignore | 6
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/controller/ZxmxManagerController.java | 39 +
cmci-pfcs-gateway/pom.xml | 87 ++
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/Application.java | 24
cmci-pfcs-gateway/src/main/resources/logback.xml | 72 +
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/util/DateUtil.java | 955 ++++++++++++++++++++++++
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/content/ZxmxContent.java | 45 +
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/util/XmlUtils.java | 95 ++
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/req/ZxmxGetScoreReqVo.java | 69 +
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/UserInfoVo.java | 62 +
cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/service/ZxmxManagerService.java | 700 +++++++++++++++++
cmci-pfcs-gateway/src/main/resources/application.properties | 2
13 files changed, 2,281 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4b3503f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+*.iml
+*.class
+target/
+.idea/
+*.prefs
+*.log
diff --git a/cmci-pfcs-gateway/pom.xml b/cmci-pfcs-gateway/pom.xml
new file mode 100644
index 0000000..bceeca7
--- /dev/null
+++ b/cmci-pfcs-gateway/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.jttech.zxmx.plat</groupId>
+ <artifactId>zxmx-plat-gateway</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <name>cmci-pfcs-gateway</name>
+ <description>Jwssw Simple Service</description>
+
+ <parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>2.3.1.RELEASE</version>
+ <relativePath/> <!-- lookup parent from repository -->
+ </parent>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <java.version>1.8</java.version>
+ <skipTests>true</skipTests>
+ </properties>
+
+ <dependencies>
+ <!-- 节选 -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-log4j2</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jdom</groupId>
+ <artifactId>jdom</artifactId>
+ <version>2.0.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.junit.vintage</groupId>
+ <artifactId>junit-vintage-engine</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>fastjson</artifactId>
+ <version>1.2.60</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
+ <resources>
+ <resource>
+ <directory>src/main/java</directory>
+ <includes>
+ <include>**/*.xml</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ </resource>
+ </resources>
+
+ </build>
+
+</project>
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/Application.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/Application.java
new file mode 100644
index 0000000..6ddb573
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/Application.java
@@ -0,0 +1,24 @@
+package com.jttech.cmci.pfcs;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 启动类
+ *
+ * @author carsonwang
+ * @version 1.0
+ * @date 2022/4/6 18:00
+ * @since JDK 1.8
+ */
+@SpringBootApplication
+public class Application {
+ /**
+ * simple service 启动入口
+ *
+ * @param args 参数集
+ */
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/content/ZxmxContent.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/content/ZxmxContent.java
new file mode 100644
index 0000000..ee00568
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/content/ZxmxContent.java
@@ -0,0 +1,45 @@
+package com.jttech.cmci.pfcs.content;
+
+/**
+ * @Description:常量
+ * @Author:carsonwang
+ * @Date:Created in 2022-04-06 16:16
+ * @Version: 1.0
+ */
+public class ZxmxContent {
+ /**
+ * ""
+ */
+ public static final String EMPTY_STR = "";
+ /**
+ * 逗号
+ */
+ public final static String SIGN_COMMA = ",";
+ /**
+ * 竖线
+ */
+ public final static String VERTICAL_LINE = "\\|";
+ public final static String reportMessage = "ReportMessage";
+ public final static String QueryInfo = "QueryInfo";
+ public final static String QueryDate = "QueryDate";
+ public final static String creditTranDetailsInfo = "CreditTranDetailsInfo";
+ public final static String beRecoveryDetailsInfo = "BeRecoveryDetailsInfo";
+ public final static String baseInfo = "BaseInfo";
+ public final static String money = "Money";
+ public final static String nonrevolvingLoanDetInfo = "NonrevolvingLoanDetInfo";
+ public final static String latestMonPerfmInfo = "LatestMonPerfmInfo";
+ public final static String currentOverdueTotal = "CurrentOverdueTotal";
+ public final static String avgUsedOfSixMonth = "AvgUsedOfSixMonth";
+ public final static String LoopQuotaSubAct = "LoopQuotaSubAct";
+ public final static String RevolvinLoanAct = "RevolvinLoanAct";
+ public final static String CreditCardAct = "CreditCardAct";
+ public final static String SemiCreditCardAct = "SemiCreditCardAct";
+ public final static String Lines = "Lines";
+ public final static String Last5YearsHisPerFmInfo = "Last5YearsHisPerFmInfo";
+ public final static String Content = "Content";
+ public final static String ReportHead = "ReportHead";
+ public final static String ThisQueryReqInfo = "ThisQueryReqInfo";
+ public final static String QueryName = "QueryName";
+ public final static String QueryCredNum = "QueryCredNum";
+
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/controller/ZxmxManagerController.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/controller/ZxmxManagerController.java
new file mode 100644
index 0000000..2eb51b3
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/controller/ZxmxManagerController.java
@@ -0,0 +1,39 @@
+package com.jttech.cmci.pfcs.controller;
+
+import com.jttech.cmci.pfcs.service.ZxmxManagerService;
+import com.jttech.cmci.pfcs.vo.req.ZxmxGetScoreReqVo;
+import com.jttech.cmci.pfcs.vo.resp.ZxmxGetScoreRespVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 征信模型
+ *
+ * @author carsonwang
+ * @version 1.0
+ * @date 2022/4/6 18:00
+ * @since JDK 1.8
+ */
+@RestController
+@RequestMapping("/zxmx")
+public class ZxmxManagerController {
+ private Logger mLogger = LoggerFactory.getLogger(getClass());
+ @Autowired
+ private ZxmxManagerService mZxmxManagerService;
+
+
+
+ /**
+ * 获取分数
+ *
+ * @return 当前环境
+ */
+ @PostMapping("/getScore")
+ public @ResponseBody
+ ZxmxGetScoreRespVo getScore(@RequestBody ZxmxGetScoreReqVo creditInfo) {
+ mLogger.info("请求参数:{}", creditInfo);
+ return mZxmxManagerService.getScore(creditInfo);
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/service/ZxmxManagerService.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/service/ZxmxManagerService.java
new file mode 100644
index 0000000..0e990ca
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/service/ZxmxManagerService.java
@@ -0,0 +1,700 @@
+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);
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/util/DateUtil.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/util/DateUtil.java
new file mode 100644
index 0000000..08c2626
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/util/DateUtil.java
@@ -0,0 +1,955 @@
+package com.jttech.cmci.pfcs.util;
+
+import org.springframework.util.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+public class DateUtil {
+ public static final SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
+
+ private static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>() {
+ @Override
+ protected SimpleDateFormat initialValue() {
+ return new SimpleDateFormat("yyyy-MM-dd");
+ }
+ };
+
+ public static String[] pattern = new String[] { "yyyyMMdd", "yyyy-MM-dd", "yyyy.MM.dd", "yyyy/MM/dd",
+ "yyyy-MM", "yyyyMM", "yyyy/MM", "yyyyMMddHHmmss", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss",
+ "yyyyMMddHHmmssSSS", "HH:mm", "HHmmss", "MM-dd HH:mm", "YYYY-MM-dd HH:mm", "MM-dd HH:mm:ss" };
+
+
+
+ public static Date previous(int days) {
+ return new Date(System.currentTimeMillis() - days * 3600000L * 24L);
+ }
+
+
+
+ public static Date addDay(Date date, int days) {
+ return new Date(date.getTime() + days * 3600000L * 24L);
+ }
+
+
+
+ public static Date addMin(Date date, int mins) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+ c.add(Calendar.MINUTE, mins);
+ // System.out.println(c.getTime());
+ return c.getTime();
+ }
+
+
+
+ public static Date addHour(Date date, int hours) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+ c.add(Calendar.HOUR_OF_DAY, hours);
+ // System.out.println(c.getTime());
+ return c.getTime();
+ }
+
+
+
+ public static String formatDateTime(String format, long d) {
+ return new SimpleDateFormat(format).format(d);
+ }
+
+
+
+ public static String formatDate(String format, Date d) {
+
+ return StringUtils.isEmpty(format) || null == d ? "" : new SimpleDateFormat(format).format(d);
+ }
+
+
+
+ public static String formatDate(Date d) {
+
+ return formatDate(pattern[7], d);
+ }
+
+
+
+ public static Date parseDate(String format, String d) {
+ try {
+ return new SimpleDateFormat(format).parse(d);
+ } catch (Exception e) {
+ throw new RuntimeException("需要时间格式为:" + format);
+ }
+ }
+
+
+
+ public static Date getNextWeekDay(int weekDay) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+
+ int addDateNumber = 0;
+ if (Calendar.SUNDAY == calendar.get(Calendar.DAY_OF_WEEK)) {
+ if (Calendar.SUNDAY == weekDay) {
+ addDateNumber = 7;
+ }
+ } else {
+ addDateNumber = 7;
+ if (Calendar.SUNDAY == weekDay) {
+ addDateNumber = 14;
+ }
+ }
+ calendar.add(Calendar.DATE, addDateNumber);
+ calendar.set(Calendar.DAY_OF_WEEK, weekDay);
+ return calendar.getTime();
+ }
+
+
+
+ public static Date getThisWeekMonday() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+
+ int min = calendar.getActualMinimum(Calendar.DAY_OF_WEEK); // 获取周开始基准
+ int current = calendar.get(Calendar.DAY_OF_WEEK); // 获取当天周内天数
+ calendar.add(Calendar.DAY_OF_WEEK, min - current + 1); // 当天-基准,获取周开始日期
+ return calendar.getTime();
+ }
+
+
+
+ /**
+ * 获取所在日期周的星期一(周一到周日为一周)
+ *
+ * @return 日期所在周的星期一
+ */
+ public static Date getWeekMonday(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+
+ int min = calendar.getActualMinimum(Calendar.DAY_OF_WEEK); // 获取周开始基准
+ int current = calendar.get(Calendar.DAY_OF_WEEK); // 获取当天周内天数
+ calendar.add(Calendar.DAY_OF_WEEK, min - current + 1 + (current == Calendar.SUNDAY ? -7 : 0)); // 当天-基准,获取周开始日期
+ return calendar.getTime();
+ }
+
+
+
+ public static Date parse(String str) {
+ try {
+ return threadLocal.get().parse(str);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+
+
+ /**
+ * 获取字符串当月第一天,需要date(yyyy-MM-dd)
+ *
+ * @param date
+ * @return
+ */
+ public static String getFirstDayOfMonth(String date) {
+ return getFirstDayOfMonth(parse(date));
+ }
+
+
+
+ /**
+ * 获取字符串当月最后一天
+ *
+ * @param date
+ * @return
+ */
+ public static String getFirstDayOfMonth(String format, String date) {
+ return getFirstDayOfMonth(parseDate(format, date));
+ }
+
+
+
+ /**
+ * 获取字符串当月第一天,需要date(yyyy-MM-dd)
+ *
+ * @param date
+ * @return
+ */
+ public static String getEndDayOfMonth(String date) {
+ return getEndDayOfMonth(parse(date));
+ }
+
+
+
+ /**
+ * 获取字符串当月最后一天
+ *
+ * @param date
+ * @return
+ */
+ public static String getEndDayOfMonth(String format, String date) {
+ return getEndDayOfMonth(parseDate(format, date));
+ }
+
+
+
+ /**
+ * 获取字符串当月最后一天
+ *
+ * @param date
+ * @return
+ */
+ public static Date getFirstDayDateOfMonth(String format, String date) {
+ return getFirstDayDateOfMonth(parseDate(format, date));
+ }
+
+
+
+ /**
+ * 获取字符串当月最后一天
+ *
+ * @param date
+ * @return
+ */
+ public static Date getEndDayDateOfMonth(String format, String date) {
+ return getEndDayDateOfMonth(parseDate(format, date));
+ }
+
+
+
+ public static String getFirstDayOfMonth(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.set(Calendar.DATE, 1);
+ return threadLocal.get().format(cal.getTime());
+ }
+
+
+
+ public static String getEndDayOfMonth(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+ return threadLocal.get().format(cal.getTime());
+ }
+
+
+
+ public static Date getFirstDayDateOfMonth(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.set(Calendar.DATE, 1);
+ return cal.getTime();
+ }
+
+
+
+ public static Date getEndDayDateOfMonth(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+ return cal.getTime();
+ }
+
+
+
+ public static Date addMonth(Date date, int count) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+ c.add(2, count);
+ return c.getTime();
+ }
+
+
+
+ public static Date addYear(Date date, int count) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+ c.add(Calendar.YEAR, count);
+ return c.getTime();
+ }
+
+
+
+ public static String getCurrentDate() {
+ return threadLocal.get().format(new Date());
+ }
+
+
+
+ public static Date getTodayDate() {
+ try {
+ return threadLocal.get().parse(getCurrentDate());
+ } catch (ParseException e) {
+ throw new RuntimeException();
+ }
+ }
+
+
+
+ public static int getDayOfWeek() {
+ Calendar cal = Calendar.getInstance();
+ return cal.get(7);
+ }
+
+
+
+ public static int getDayOfWeek(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ return cal.get(7);
+ }
+
+
+
+ public static int getDayOfWeek(String date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(parse(date));
+ return cal.get(7);
+ }
+
+
+
+ public static int getMaxDayOfMonth(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ return cal.getActualMaximum(5);
+ }
+
+
+
+ public static String toString(Date date) {
+ if (date == null)
+ return "";
+ else
+ return threadLocal.get().format(date);
+ }
+
+
+
+ public static String toString(Date date, String format) {
+ SimpleDateFormat t = new SimpleDateFormat(format);
+ return t.format(date);
+ }
+
+
+
+ // 获取当前年
+ public static String getYear() {
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
+ return formatter.format(new Date());
+ }
+
+
+
+ // 获取年
+ public static String getYear(Date date) {
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
+ return formatter.format(date);
+ }
+
+
+
+ // 获取当年月
+ public static String getMonth() {
+ SimpleDateFormat formatter = new SimpleDateFormat("MM");
+ return formatter.format(new Date());
+ }
+
+
+
+ // 获取当年月
+ public static String getYearMonth() {
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyyMM");
+ return formatter.format(new Date());
+ }
+
+
+
+ // 获取月
+ public static String getMonth(Date date) {
+ SimpleDateFormat formatter = new SimpleDateFormat("MM");
+ return formatter.format(date);
+ }
+
+
+
+ // 获取当日
+ public static String getDay() {
+ SimpleDateFormat formatter = new SimpleDateFormat("dd");
+ return formatter.format(new Date());
+ }
+
+
+
+ // 获取日
+ public static String getDay(Date date) {
+ SimpleDateFormat formatter = new SimpleDateFormat("dd");
+ return formatter.format(date);
+ }
+
+
+
+ /**
+ * 月
+ *
+ * @return
+ */
+ public static List<String> getMonthList() {
+ List<String> list = new ArrayList<String>();
+ list.add("01");
+ list.add("02");
+ list.add("03");
+ list.add("04");
+ list.add("05");
+ list.add("06");
+ list.add("07");
+ list.add("08");
+ list.add("09");
+ list.add("10");
+ list.add("11");
+ list.add("12");
+ return list;
+ }
+
+
+
+ // 计算相差时间
+ public static double dateDiff(String startTime, String endTime, String format) {
+ SimpleDateFormat sd = new SimpleDateFormat(format);
+ long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
+ long nh = 1000 * 60 * 60;// 一小时的毫秒数
+ long diff;
+ double hour = 0;
+ try {
+ // 获得两个时间的毫秒时间差异
+ diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
+ hour = (diff % nd) * 1.0f / nh;// 计算差多少小时
+
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ // DecimalFormat df = new DecimalFormat("#.00");
+ System.out.println(new Double(String.format("%.2f", hour)));
+ return new Double(String.format("%.2f", hour));
+ }
+
+
+
+ // 计算相差天数时间
+ public static int dateDayDiff(String startTime, String endTime, String format) {
+ SimpleDateFormat sd = new SimpleDateFormat(format);
+ long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
+ long diff;
+ int day = 0;
+ try {
+ // 获得两个时间的毫秒时间差异
+ diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
+ day = (int) (diff / nd);// 计算差多少天
+
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return day;
+ }
+
+
+
+ public static List<WeekDay> getDisplayWeekDays(Date startTime, Date endTime) {
+ List<WeekDay> weekDays = new ArrayList<WeekDay>();
+ Date date = startTime;
+ long endTimeLong = endTime.getTime();
+ while (date.getTime() <= endTimeLong) {
+ weekDays.add(new WeekDay(date));
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.add(Calendar.DATE, 1);
+ date = calendar.getTime();
+ }
+ return weekDays;
+ }
+
+ public static class WeekDay {
+
+ private Date date;
+
+ private static final String[] WEEK_DAY_NAME = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
+
+
+
+ public WeekDay() {
+ }
+
+
+
+ public WeekDay(Date date) {
+ this.setDate(date);
+ }
+
+
+
+ public Date getDate() {
+ return date;
+ }
+
+
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public String toString() {
+ return threadLocal.get().format(date) + "(" + WEEK_DAY_NAME[date.getDay()] + ")";
+ }
+
+
+
+ @SuppressWarnings("deprecation")
+ public String getDay() {
+ return WEEK_DAY_NAME[date.getDay()];
+ }
+ }
+
+
+
+ // 指定日期所在月的第一天日期
+ public static Date getBeginDayOfMonth(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.set(Calendar.DATE, 1);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar.getTime();
+ }
+
+
+
+ // 获取指定日期的下个月的日期
+ public static Date getNextBeginDayOfMonth(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.set(Calendar.DATE, 1);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ calendar.add(Calendar.MONTH, +1);
+ return calendar.getTime();
+ }
+
+
+
+ // 指定日期所在年的第一天日期
+ public static Date getBeginDayOfYear(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.set(Calendar.MONTH, 0);
+ calendar.set(Calendar.DATE, 1);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar.getTime();
+ }
+
+
+
+ public static Date getEndDayOfYear(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.set(Calendar.MONTH, calendar.getActualMaximum(Calendar.MONTH));
+ calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
+ calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
+ calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
+ calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
+ calendar.set(Calendar.MILLISECOND, calendar.getActualMaximum(Calendar.MILLISECOND));
+ return calendar.getTime();
+ }
+
+
+
+ // 获取指定日期的下年的日期
+ public static Date getNextBeginDayOfYear(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.set(Calendar.MONTH, 1);
+ calendar.set(Calendar.DATE, 1);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ calendar.add(Calendar.YEAR, +1);
+ return calendar.getTime();
+ }
+
+
+
+ /**
+ * @param startDate
+ * @param endDate
+ * @return
+ * @功能描述:
+ * <p>
+ * 获取两个时间相差秒
+ * </p>
+ * @创建作者: lance
+ * @创建日期: 2016年12月12日 下午12:02:30
+ */
+ public static Integer getTimeSecond(Date startDate, Date endDate) {
+ long start = startDate.getTime();
+ long end = endDate.getTime();
+ int second = (int) ((end - start) / 1000);
+ return second;
+
+ }
+
+
+
+ /**
+ * @param beginDate
+ * @param endDate
+ * @return
+ * @功能描述:
+ * <p>
+ * 获取两个日期之间的天数
+ * </p>
+ * @创建作者: lance
+ * @创建日期: 2017年1月6日 上午10:52:47
+ */
+ public static Integer getDays(String beginDate, String endDate) {
+ SimpleDateFormat sd = new SimpleDateFormat(DateUtil.pattern[1]);
+ try {
+ return (int) ((sd.parse(endDate).getTime() - sd.parse(beginDate).getTime()) / 86400000);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+
+ /**
+ * @param beginDate
+ * @param endDate
+ * @return
+ * @功能描述:
+ * <p>
+ * 获取两个日期之间的天数
+ * </p>
+ * @创建作者: lance
+ * @创建日期: 2017年1月6日 上午10:52:47
+ */
+ public static Integer getDays(Date beginDate, Date endDate) {
+ return (int) ((getDayBeginTime(endDate).getTime() - getDayBeginTime(beginDate).getTime()) / 86400000);
+ }
+
+
+
+ /**
+ * @param date
+ * @return
+ * @功能描述:
+ * <p>
+ * 获取两个日期之间的天数
+ * </p>
+ * @创建作者: lance
+ * @创建日期: 2017年1月6日 上午10:52:47
+ */
+ public static Date getDayBeginTime(Date date) {
+ try {
+ String dateStr = threadLocal.get().format(date);
+ return threadLocal.get().parse(dateStr);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+
+ public static Integer getDayOfHour(Date date) {
+ String hour = new SimpleDateFormat("HH").format(date);
+ return Integer.valueOf(hour);
+ }
+
+
+
+ public static Integer getDayOfMinute(Date date) {
+ String hour = new SimpleDateFormat("mm").format(date);
+ return Integer.valueOf(hour);
+ }
+
+
+
+ public static Date getDayEndTime(Date date) {
+ try {
+ return new Date(getDayBeginTime(date).getTime() + 0x5265BFFL);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+
+ /**
+ * 获取当前时间距离当天结束的分钟数
+ *
+ * @param date
+ * @return
+ */
+ public static Integer getDayEndMinute(Date date) {
+ Date dayEndTime = getDayEndTime(date);
+ Integer timeSecond = getTimeSecond(date, dayEndTime);
+ return timeSecond / 60;
+ }
+
+
+
+ /**
+ * 计算两点时间间隔年
+ *
+ * @param startTime
+ * @param endTime
+ * @param format
+ * @return
+ */
+ public static int betweenTimesYear(String startTime, String endTime, String format) {
+ SimpleDateFormat sd = new SimpleDateFormat(format);
+
+ int year = 0;
+ try {
+ long end = sd.parse(endTime).getTime();
+ long start = sd.parse(startTime).getTime();
+ long oneYear = 1000l * 60 * 60 * 24 * 365;
+ year = (int) ((end - start) / oneYear);
+ } catch (ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return year;
+ }
+
+
+
+ public static int getAgeByBirth(Date birthday) {
+ int age = 0;
+ try {
+ Calendar now = Calendar.getInstance();
+ now.setTime(new Date());// 当前时间
+
+ Calendar birth = Calendar.getInstance();
+ birth.setTime(birthday);
+
+ if (birth.after(now)) {// 如果传入的时间,在当前时间的后面,返回0岁
+ age = 0;
+ } else {
+ age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR);
+ if (now.get(Calendar.DAY_OF_YEAR) < birth.get(Calendar.DAY_OF_YEAR)) {
+ age -= 1;
+ }
+ }
+ return age;
+ } catch (Exception e) {
+ throw new RuntimeException("身份证号异常");
+ }
+ }
+
+
+
+ /**
+ * 获取精确到秒的时间戳
+ *
+ * @param pDate
+ * @return
+ */
+ public static int getSecondTimestamp(Date pDate) {
+ if (null == pDate) {
+ return 0;
+ }
+ String timestamp = String.valueOf(pDate.getTime() / 1000);
+ return Integer.valueOf(timestamp);
+ }
+
+
+
+ /**
+ * 秒时间戳转成时间
+ *
+ * @param pSecondTimestamp
+ * @return
+ */
+ public static Date parseSecondTimestamp(int pSecondTimestamp) {
+ Date date = null;
+ if (pSecondTimestamp != 0) {
+ date = new Date(pSecondTimestamp * 1000L);
+ }
+ return date;
+ }
+
+
+
+ public static Date getLastQuarterStartTime() {
+ Calendar startCalendar = Calendar.getInstance();
+ startCalendar.set(Calendar.MONTH, (startCalendar.get(Calendar.MONTH) / 3 - 1) * 3);
+ startCalendar.set(Calendar.DAY_OF_MONTH, 1);
+ setMinTime(startCalendar);
+ return startCalendar.getTime();
+ }
+
+
+
+ public static Date getLastQuarterEndTime() {
+ Calendar endCalendar = Calendar.getInstance();
+ endCalendar.set(Calendar.MONTH, (endCalendar.get(Calendar.MONTH) / 3 - 1) * 3 + 2);
+ endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+ setMaxTime(endCalendar);
+
+ return endCalendar.getTime();
+ }
+
+
+
+ public static Date getQuarterStartTime(Integer year, Integer quarter) {
+ Calendar quarterCalendar = Calendar.getInstance();
+ quarterCalendar.set(Calendar.YEAR, year);
+ switch (quarter) {
+ case 1:
+ quarterCalendar.set(Calendar.MONTH, 0);
+ break;
+ case 2:
+ quarterCalendar.set(Calendar.MONTH, 3);
+ break;
+ case 3:
+ quarterCalendar.set(Calendar.MONTH, 6);
+ break;
+ case 4:
+ quarterCalendar.set(Calendar.MONTH, 9);
+ break;
+ default:
+ }
+ quarterCalendar.set(Calendar.DAY_OF_MONTH, 1);
+ setMinTime(quarterCalendar);
+ return quarterCalendar.getTime();
+ }
+
+
+
+ public static Date getQuarterEndTime(Integer year, Integer quarter) {
+ Calendar quarterCalendar = Calendar.getInstance();
+ quarterCalendar.set(Calendar.YEAR, year);
+ switch (quarter) {
+ case 1:
+ quarterCalendar.set(Calendar.MONTH, 2);
+ break;
+ case 2:
+ quarterCalendar.set(Calendar.MONTH, 5);
+ break;
+ case 3:
+ quarterCalendar.set(Calendar.MONTH, 8);
+ break;
+ case 4:
+ quarterCalendar.set(Calendar.MONTH, 11);
+ break;
+ default:
+ }
+ quarterCalendar.set(Calendar.DAY_OF_MONTH, quarterCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+ setMaxTime(quarterCalendar);
+ return quarterCalendar.getTime();
+ }
+
+
+
+ public static Date getMonthStartTime(Integer year, Integer month) {
+ Calendar monthCalendar = Calendar.getInstance();
+ monthCalendar.set(Calendar.YEAR, year);
+ monthCalendar.set(Calendar.MONTH, month - 1);
+ monthCalendar.set(Calendar.DAY_OF_MONTH, 1);
+ setMinTime(monthCalendar);
+ return monthCalendar.getTime();
+ }
+
+
+
+ public static Date getMonthEndTime(Integer year, Integer month) {
+ Calendar monthCalendar = Calendar.getInstance();
+ monthCalendar.set(Calendar.YEAR, year);
+ monthCalendar.set(Calendar.MONTH, month - 1);
+ monthCalendar.set(Calendar.DAY_OF_MONTH, monthCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+ setMaxTime(monthCalendar);
+ return monthCalendar.getTime();
+ }
+
+
+
+ public static Date getYearStartTime(Integer year) {
+ Calendar quarterCalendar = Calendar.getInstance();
+ quarterCalendar.set(Calendar.YEAR, year);
+ quarterCalendar.set(Calendar.MONTH, 0);
+ quarterCalendar.set(Calendar.DAY_OF_MONTH, 1);
+ setMinTime(quarterCalendar);
+ return quarterCalendar.getTime();
+ }
+
+
+
+ public static Date getYearEndTime(Integer year) {
+ Calendar quarterCalendar = Calendar.getInstance();
+ quarterCalendar.set(Calendar.YEAR, year);
+ quarterCalendar.set(Calendar.MONTH, 11);
+ quarterCalendar.set(Calendar.DAY_OF_MONTH, quarterCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+ setMaxTime(quarterCalendar);
+ return quarterCalendar.getTime();
+ }
+
+
+
+ public static Date getDayEndTimeWithoutMillisecond(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.set(Calendar.HOUR_OF_DAY, 23);
+ calendar.set(Calendar.MINUTE, 59);
+ calendar.set(Calendar.SECOND, 59);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar.getTime();
+ }
+
+
+
+ private static void setMinTime(Calendar calendar) {
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ }
+
+
+
+ private static void setMaxTime(Calendar calendar) {
+ calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
+ calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
+ calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
+ calendar.set(Calendar.MILLISECOND, calendar.getActualMaximum(Calendar.MILLISECOND));
+ }
+
+}
\ No newline at end of file
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/util/XmlUtils.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/util/XmlUtils.java
new file mode 100644
index 0000000..d1807d6
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/util/XmlUtils.java
@@ -0,0 +1,95 @@
+package com.jttech.cmci.pfcs.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jttech.cmci.pfcs.vo.req.ZxmxGetScoreReqVo;
+import org.jdom2.Document;
+import org.jdom2.Element;
+import org.jdom2.input.SAXBuilder;
+import org.springframework.util.StringUtils;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author Skaði the Corrupting Heart
+ * @version 1.0.0
+ * @ClassName xml.java
+ * @Description TODO
+ * @createTime 2022年04月02日 17:12
+ */
+public class XmlUtils {
+
+ public static JSONObject xml2Json(String xmlStr) {
+ try {
+ if (StringUtils.isEmpty(xmlStr)) {
+ return null;
+ }
+ xmlStr = xmlStr.replaceAll("\\\n", "");
+ byte[] xml = xmlStr.getBytes("UTF-8");
+ JSONObject json = new JSONObject();
+ InputStream is = new ByteArrayInputStream(xml);
+ SAXBuilder sb = new SAXBuilder();
+ Document doc = sb.build(is);
+ Element root = doc.getRootElement();
+ json.put(root.getName(), iterateElement(root));
+
+ return json;
+ } catch (Exception pE) {
+ throw new RuntimeException("xml文件解析失败", pE);
+ }
+
+
+ }
+
+
+ private static JSONObject iterateElement(Element element) {
+ List<Element> node = element.getChildren();
+ JSONObject obj = new JSONObject();
+ List list = null;
+ for (Element child : node) {
+ list = new LinkedList();
+ String text = child.getTextTrim();
+ if (StringUtils.isEmpty(text)) {
+ if (child.getChildren().size() == 0) {
+ continue;
+ }
+ if (obj.containsKey(child.getName())) {
+ list = (List) obj.get(child.getName());
+ }
+ list.add(iterateElement(child)); // 遍历child的子节点
+ obj.put(child.getName(), list);
+ } else {
+ if (obj.containsKey(child.getName())) {
+ Object value = obj.get(child.getName());
+ try {
+ list = (List) value;
+ } catch (ClassCastException e) {
+ list.add(value);
+ }
+ }
+ if (child.getChildren().size() == 0) { // child无子节点时直接设置text
+ obj.put(child.getName(), text);
+ } else {
+ list.add(text);
+ obj.put(child.getName(), list);
+ }
+ }
+ }
+ return obj;
+
+ }
+
+
+ public static void main(String[] args) {
+ String a = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ReportMessage><ReportHead><ReportIdentInfo><ReportId>2022051909455761166981</ReportId><ReportTime>2022.05.19 09:45:57</ReportTime></ReportIdentInfo><ThisQueryReqInfo><QueryName>罗玉林</QueryName><QueryCertType>身份证</QueryCertType><QueryCredNum>522424200009281017</QueryCredNum><QueryOrg>深圳市中裔信息工程融资担保有限公司</QueryOrg><QueryReasonCode>担保资格审查</QueryReasonCode></ThisQueryReqInfo><ObjPromptMsg><Info>信息主体对信用报告内容提出了0笔异议且正在处理中,请浏览时注意阅读相关内容。</Info></ObjPromptMsg></ReportHead><BaseInfo><IdentityInfo><SurveyInfo><Gender>男</Gender><DateOfBirth>2000.09.28</DateOfBirth><MaritalStatus>未婚</MaritalStatus><Education>初中及以下</Education><Degree>其他</Degree><WorkStatus>--</WorkStatus><Citizenship>--</Citizenship><Email>--</Email><ContactAddress>广东揭阳揭东区磐东镇河中村新世纪商场附近</ContactAddress><ResidenceAddress>--</ResidenceAddress></SurveyInfo><PhoneInfo><No>1</No><Phone>17685170689</Phone><InfoUpdateDate>2018.10.04</InfoUpdateDate></PhoneInfo></IdentityInfo><ResideInfo><No>1</No><ResideAddr>广东揭阳揭东区磐东镇河中村新世纪商场附近</ResideAddr><ResidePhone>--</ResidePhone><ResideStatus>--</ResideStatus><InfoUpdateDate>2018.10.04</InfoUpdateDate></ResideInfo></BaseInfo><ReportSumamry><CreditTranPromptInfo><No>1</No><BusinessType>个人住房贷款</BusinessType><AccountNum>--</AccountNum><FirstBusinessReleaseMonth>--</FirstBusinessReleaseMonth></CreditTranPromptInfo><CreditTranPromptInfo><No>2</No><BusinessType>个人商用房贷款(包括商住两用房)</BusinessType><AccountNum>--</AccountNum><FirstBusinessReleaseMonth>--</FirstBusinessReleaseMonth></CreditTranPromptInfo><CreditTranPromptInfo><No>3</No><BusinessType>其他类贷款</BusinessType><AccountNum>1</AccountNum><FirstBusinessReleaseMonth>2018.10</FirstBusinessReleaseMonth></CreditTranPromptInfo><CreditTranPromptInfo><No>4</No><BusinessType>贷记卡</BusinessType><AccountNum>--</AccountNum><FirstBusinessReleaseMonth>--</FirstBusinessReleaseMonth></CreditTranPromptInfo><CreditTranPromptInfo><No>5</No><BusinessType>准贷记卡</BusinessType><AccountNum>--</AccountNum><FirstBusinessReleaseMonth>--</FirstBusinessReleaseMonth></CreditTranPromptInfo><CreditTranPromptInfo><No>6</No><BusinessType>--</BusinessType><AccountNum>--</AccountNum><FirstBusinessReleaseMonth>--</FirstBusinessReleaseMonth></CreditTranPromptInfo><CreditTranPromptInfo><No>7</No><BusinessType>合计</BusinessType><AccountNum>1</AccountNum><FirstBusinessReleaseMonth>--</FirstBusinessReleaseMonth></CreditTranPromptInfo><CreditDefaultSumInfo><BadDebtsSummInfo><AccountNum>1</AccountNum><Balance>1,919</Balance></BadDebtsSummInfo></CreditDefaultSumInfo><CreditTranAndDebtSummInfo><NonrevolvingLoanSummInfo><OrgNum>1</OrgNum><AccountNum>1</AccountNum><AuthorizationTotal>2,665</AuthorizationTotal><Balance>1,919</Balance><AvgRepaymentLastSixMonth>2,170</AvgRepaymentLastSixMonth></NonrevolvingLoanSummInfo><RevolvingLoanAccountSummInfo/></CreditTranAndDebtSummInfo><QueryRecordSummary><LastQueryRecordInfo><LastQueryDate>2022.04.12</LastQueryDate><LastQueryOrg>商业银行\"CW\"</LastQueryOrg><LastQueryReason>信用卡审批</LastQueryReason></LastQueryRecordInfo><QueryRecordSummInfo><NumQueryOrgLoanApprovalLastOneMonth>0</NumQueryOrgLoanApprovalLastOneMonth><NumQueryOrgCreditCardApprovalLastOneMonth>0</NumQueryOrgCreditCardApprovalLastOneMonth><NumQueryLoanApprovalLastOneMonth>0</NumQueryLoanApprovalLastOneMonth><NumQueryCreditCardApprovalLastOneMonth>0</NumQueryCreditCardApprovalLastOneMonth><NumQuerySelfQueryLastOneMonth>0</NumQuerySelfQueryLastOneMonth><NumQueryPostLoanManagementLastTwoYear>3</NumQueryPostLoanManagementLastTwoYear><NumQueryGuaranteeQualificationReviewLastTwoYear>0</NumQueryGuaranteeQualificationReviewLastTwoYear><NumQuerySpecialMerchantRealNameReviewLastTwoYear>0</NumQuerySpecialMerchantRealNameReviewLastTwoYear></QueryRecordSummInfo></QueryRecordSummary></ReportSumamry><CreditTranDetailsInfo><NonrevolvingLoanDetInfo><BaseInfo><CreditPrtlIdent>账户</CreditPrtlIdent><ManagmtOrg>消费金融公司\"YY\"</ManagmtOrg><AccountId>******</AccountId><IssuanceDate>2018.10.04</IssuanceDate><DueDate>2019.08.31</DueDate><Money>2,665</Money><Currency>人民币元</Currency><Type>其他个人消费贷款</Type><GuratMode>信用/免担保</GuratMode><RepayPerid>10</RepayPerid><RepayFrequency>月</RepayFrequency><RepayType>--</RepayType><CommonBwMark>无</CommonBwMark></BaseInfo><LatestPerformanceInfo><Title>截至2022年04月30日</Title><AccountStatus>呆账</AccountStatus><Balance>1,919</Balance><LastRepayDate>2019.02.20</LastRepayDate></LatestPerformanceInfo><Last5YearsHisPerFmInfo><Title>2018年10月 —2022年04月的还款记录</Title><Content>7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|7_2,170|6_1,856|5_0|4_1,232|3_920|2_608|1_296|N_0|N_0|N_0|*_0|</Content></Last5YearsHisPerFmInfo></NonrevolvingLoanDetInfo></CreditTranDetailsInfo><NonCreditTranDetailsInfo/><PublicInfo/><OpenInfo/><QueryInfo><No>1</No><QueryDate>2022.04.12</QueryDate><QueryOrg>商业银行\"CW\"</QueryOrg><Reason>信用卡审批</Reason></QueryInfo><QueryInfo><No>2</No><QueryDate>2020.10.29</QueryDate><QueryOrg>商业银行\"AV\"</QueryOrg><Reason>信用卡审批</Reason></QueryInfo><QueryInfo><No>3</No><QueryDate>2020.10.23</QueryDate><QueryOrg>小额贷款公司\"KU\"</QueryOrg><Reason>贷款审批</Reason></QueryInfo><QueryInfo><No>4</No><QueryDate>2020.10.07</QueryDate><QueryOrg>消费金融公司\"QY\"</QueryOrg><Reason>贷款审批</Reason></QueryInfo><RptExplain><Title>报告说明</Title><Content>1. 本报告中的“数字解读”仅供使用本信用报告的银行等授信机构参考,授信机构应自行承担使用“数字解读”的相关法律责任。2. “数字解读”将信用报告内容解读为一个数值,是对信用主体未来信贷违约可能性的预测,其取值范围为 0 到 1000,分值越高,违约可能性越低;“相对位置”是信用主体的数字解读值在全部人群中的百分比排序位置,比如“>50%”代表该数字解读值高于 50%的信用主体;“说明”中的“影响因素”是影响信用主体获得更高数字解读值的原因,根据当前信用报告的实际情况给出,最多有两条。“数字解读”显示为“--”的,仅代表无法根据当前信用报告内容给出数字解读值,并无其他含义。无法给出数字解读值的具体原因见“说明” 。3. 本报告的信贷交易信息提示中,“业务类型”为“其他” 的汇总信息不包含“资产处置” 和“垫款” 业务。4. 本报告中如果没有“信贷交易违约信息概要”信息,说明信用主体最近 5 年内没有连续逾期。5. 对于存在授信限额的协议信息,信息主体的可用额度需结合“授信协议信息” 中的授信额度、 授信限额信息和余额进行估算。6. 本报告中的信贷交易授信及负债信息概要展示的信息是指未结清/未销户的授信及负债信息。7. 本报告的借贷交易明细信息中,循环贷账户的到期日期是指账户授信额度的到期日期。8. 本报告的借贷交易明细信息中,借贷账户展示最近 5 年的还款情况,包括当前还款状态和当前逾期总额。9.对于通过自助渠道办理的“小额、 高频” 业务,金融机构将合并报送相关账户,展示在本报告的借贷交易明细信息中; 此时账户的还款方式为“不区分还款方式”,该账户的还款频率统一约定为“月”,“还款期数”按月计算, 其还款信息按月进行观测和更新。10.本报告中的逾期准贷记卡账户是指该账户 60 天以上的透支行为。11.本报告中的还款期数为“--”是指该账户是非分期还款。12.本报告不展示 5 年前已经结束的违约行为,以及 5 年前的欠税记录、强制执行记录、民事判决记录、行政处罚记录、电信欠费记录。13.机构说明是数据提供机构对具体业务添加的特别说明信息。14.本人声明是信息主体对信用报告中的信息所附注的简要说明,信用主体对本人声明的真实性负责。15.异议标注是征信中心添加的,用于说明信用主体对信用报告中的哪些信息有异议。16.本报告内容涉及个人隐私,查询者应依法使用、妥善保管。因使用不当造成个人信息泄露的,征信中心将不承担相关责任。17.本报告中所有金额(除“有相关还款责任的企业借款”中的金额外)均为人民币金额,参照查询日前一天的汇。18.本报告整合了数据提供机构以信息主体不同证件报送的信息。</Content></RptExplain></ReportMessage>";
+
+
+// System.out.println(xml2Json(a));
+ ZxmxGetScoreReqVo zxmxGetScoreReqVo = new ZxmxGetScoreReqVo();
+ zxmxGetScoreReqVo.setZxData(a);
+ System.out.println(JSONObject.toJSONString(zxmxGetScoreReqVo));
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/UserInfoVo.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/UserInfoVo.java
new file mode 100644
index 0000000..2a97319
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/UserInfoVo.java
@@ -0,0 +1,62 @@
+package com.jttech.cmci.pfcs.vo;
+
+/**
+ * @Description:用户信息
+ * @Author:carsonwang
+ * @Date:Created in 2022-04-07 10:52
+ * @Version: 1.0
+ */
+public class UserInfoVo {
+ /**
+ * 用户名
+ */
+ private String username;
+ /**
+ * 身份证号码
+ */
+ private String idNo;
+
+
+
+ public String getUsername() {
+ return username;
+ }
+
+
+
+ public void setUsername(String pUsername) {
+ username = pUsername;
+ }
+
+
+
+ public String getIdNo() {
+ return idNo;
+ }
+
+
+
+ public void setIdNo(String pIdNo) {
+ idNo = pIdNo;
+ }
+
+
+
+ public UserInfoVo() {
+ }
+
+
+
+ public UserInfoVo(String pUsername, String pIdNo) {
+ username = pUsername;
+ idNo = pIdNo;
+ }
+
+
+
+ @Override
+ public String toString() {
+ return "{\"UserInfoVo\":{" + "\"username\":\"" + username + '\"' + ",\"idNo\":\"" + idNo + '\"' + "}}";
+
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/req/ZxmxGetScoreReqVo.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/req/ZxmxGetScoreReqVo.java
new file mode 100644
index 0000000..e4414c6
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/req/ZxmxGetScoreReqVo.java
@@ -0,0 +1,69 @@
+package com.jttech.cmci.pfcs.vo.req;
+
+import java.io.Serializable;
+
+/**
+ * @Description:征信信息请求VO
+ * @Author:carsonwang
+ * @Date:Created in 2022-04-06 15:27
+ * @Version: 1.0
+ */
+public class ZxmxGetScoreReqVo implements Serializable {
+ /**
+ * 征信数据
+ */
+ private String zxData;
+ /**
+ * 流水号
+ */
+ private String serialNum;
+ /**
+ * 请求编号
+ */
+ private String requestId;
+
+
+
+ public String getZxData() {
+ return zxData;
+ }
+
+
+
+ public void setZxData(String pZxData) {
+ zxData = pZxData;
+ }
+
+
+
+ public String getSerialNum() {
+ return serialNum;
+ }
+
+
+
+ public void setSerialNum(String pSerialNum) {
+ serialNum = pSerialNum;
+ }
+
+
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+
+
+ public void setRequestId(String pRequestId) {
+ requestId = pRequestId;
+ }
+
+
+
+ @Override
+ public String toString() {
+ return "{\"ZxmxGetScoreReqVo\":{" + "\"zxData\":\"" + zxData + '\"' + ",\"serialNum\":\"" + serialNum + '\"'
+ + ",\"requestId\":\"" + requestId + '\"' + "}}";
+
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/resp/ZxmxGetScoreRespVo.java b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/resp/ZxmxGetScoreRespVo.java
new file mode 100644
index 0000000..0e17fe6
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/cmci/pfcs/vo/resp/ZxmxGetScoreRespVo.java
@@ -0,0 +1,125 @@
+package com.jttech.cmci.pfcs.vo.resp;
+
+import java.io.Serializable;
+
+/**
+ * @Description:征信信息请求VO
+ * @Author:carsonwang
+ * @Date:Created in 2022-04-06 15:27
+ * @Version: 1.0
+ */
+public class ZxmxGetScoreRespVo implements Serializable {
+
+ /**
+ * 逾期总金额(被追偿信息债权金额+非循环贷账户当前逾期总额+循环额度下分账户当前逾期总额+循环贷账户当前逾期总额+贷记卡账户当前逾期总额)
+ */
+ private Integer overdueTotal = 0;
+
+ /**
+ * 贷记卡授信总额度(所有贷记卡授信金额求和)
+ */
+ private Integer creditLines = 0;
+
+ /**
+ * 近六个月平均应还款额(信贷交易授信及负债信息概要
+ * :非循环贷账户信息汇总-最近6个月平均应还款+循环额度下分账户信息汇总-最近6个月平均应还款+循环贷账户信息汇总-最近6个月平均应还+
+ * 贷记卡账户信息汇总-最近6个月平均使用额度+准贷记卡账户信息汇总-最近6个月平均透支余额)
+ */
+ private Integer avgUsedOfSixMonth = 0;
+
+ /**
+ * 近一年逾期次数("非循环贷账户/循环额度下分账户/循环贷账户/贷记卡账户/准贷记卡账户 账户中近一年还款月中为逾期的总次数")
+ */
+ private Integer overdueNumOfYear = 0;
+
+ /**
+ * 近一年查征次数(根据查征记录中近一年查询次数计算)
+ */
+ private Integer queryNumOfYear = 0;
+
+
+
+ public Integer getOverdueTotal() {
+ return overdueTotal;
+ }
+
+
+
+ public void setOverdueTotal(Integer pOverdueTotal) {
+ overdueTotal = pOverdueTotal;
+ }
+
+
+
+ public Integer getCreditLines() {
+ return creditLines;
+ }
+
+
+
+ public void setCreditLines(Integer pCreditLines) {
+ creditLines = pCreditLines;
+ }
+
+
+
+ public Integer getAvgUsedOfSixMonth() {
+ return avgUsedOfSixMonth;
+ }
+
+
+
+ public void setAvgUsedOfSixMonth(Integer pAvgUsedOfSixMonth) {
+ avgUsedOfSixMonth = pAvgUsedOfSixMonth;
+ }
+
+
+
+ public Integer getOverdueNumOfYear() {
+ return overdueNumOfYear;
+ }
+
+
+
+ public void setOverdueNumOfYear(Integer pOverdueNumOfYear) {
+ overdueNumOfYear = pOverdueNumOfYear;
+ }
+
+
+
+ public Integer getQueryNumOfYear() {
+ return queryNumOfYear;
+ }
+
+
+
+ public void setQueryNumOfYear(Integer pQueryNumOfYear) {
+ queryNumOfYear = pQueryNumOfYear;
+ }
+
+
+
+ public ZxmxGetScoreRespVo() {
+ }
+
+
+
+ public ZxmxGetScoreRespVo(Integer pOverdueTotal, Integer pCreditLines, Integer pAvgUsedOfSixMonth,
+ Integer pOverdueNumOfYear, Integer pQueryNumOfYear) {
+ overdueTotal = pOverdueTotal;
+ creditLines = pCreditLines;
+ avgUsedOfSixMonth = pAvgUsedOfSixMonth;
+ overdueNumOfYear = pOverdueNumOfYear;
+ queryNumOfYear = pQueryNumOfYear;
+ }
+
+
+
+ @Override
+ public String toString() {
+ return "{\"ZxmxGetScoreRespVo\":{" + "\"overdueTotal\":" + overdueTotal + ",\"creditLines\":" + creditLines
+ + ",\"avgUsedOfSixMonth\":" + avgUsedOfSixMonth + ",\"overdueNumOfYear\":" + overdueNumOfYear
+ + ",\"queryNumOfYear\":" + queryNumOfYear + "}}";
+
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/resources/application.properties b/cmci-pfcs-gateway/src/main/resources/application.properties
new file mode 100644
index 0000000..d9f4f96
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+server.port=8400
+logging.config=classpath:logback.xml
\ No newline at end of file
diff --git a/cmci-pfcs-gateway/src/main/resources/logback.xml b/cmci-pfcs-gateway/src/main/resources/logback.xml
new file mode 100644
index 0000000..c8aa4a7
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/resources/logback.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
+<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
+<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
+<configuration status="WARN" monitorInterval="1800">
+ <Properties>
+ <!-- 日志默认存放的位置,这里设置为项目根路径下,也可指定绝对路径 -->
+ <!-- ${web:rootDir}是web项目根路径,java项目没有这个变量,需要删掉,否则会报异常 -->
+ <!--<property name="basePath">D://log4j2Logs</property>-->
+<!-- <property name="basePath">/home/log/zxmx-plat</property>-->
+ <property name="basePath">logs</property>
+
+ <!-- 控制台默认输出格式,"%-5level":日志级别,"%l":输出完整的错误位置,是小写的L,因为有行号显示,所以影响日志输出的性能 -->
+ <property name="console_log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %l - %m%n</property>
+ <!-- 日志文件默认输出格式,不带行号输出(行号显示会影响日志输出性能);%C:大写,类名;%M:方法名;%m:错误信息;%n:换行 -->
+ <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M - %m%n</property>
+
+ <!-- 日志默认切割的最小单位 -->
+ <property name="every_file_size">20MB</property>
+ <!-- 日志默认输出级别 -->
+ <property name="output_log_level">INFO</property>
+
+ <!-- 日志默认存放路径(所有级别日志) -->
+ <property name="rolling_fileName">${basePath}/log/zxmx-plat-gateway.log</property>
+ <!-- 日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
+ <property name="rolling_filePattern">${basePath}/back/%d{yyyy-MM}/zxmx-plat-gateway-%d{yyyy-MM-dd}-%i.log.gz</property>
+ <!-- 日志默认同类型日志,同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
+ <property name="rolling_max">50</property>
+
+ <!-- 控制台显示的日志最低级别 -->
+ <property name="console_print_level">INFO</property>
+
+ </Properties>
+
+ <!--定义appender -->
+ <appenders>
+ <!-- 用来定义输出到控制台的配置 -->
+ <Console name="Console" target="SYSTEM_OUT">
+ <!-- 设置控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
+ <ThresholdFilter level="${console_print_level}" onMatch="ACCEPT" onMismatch="DENY"/>
+ <!-- 设置输出格式,不设置默认为:%m%n -->
+ <PatternLayout pattern="${console_log_pattern}"/>
+ </Console>
+
+ <!-- 打印root中指定的level级别以上的日志到文件 -->
+ <RollingFile name="RollingFile" fileName="${rolling_fileName}" filePattern="${rolling_filePattern}">
+ <PatternLayout pattern="${log_pattern}"/>
+ <Policies>
+ <SizeBasedTriggeringPolicy size="${every_file_size}"/>
+ </Policies>
+ <!-- 设置同类型日志,同一文件夹下可以存放的数量,如果不设置此属性则默认存放7个文件 -->
+ <DefaultRolloverStrategy max="${rolling_max}" />
+ <!-- 匹配INFO以及以上级别 -->
+ <Filters>
+ <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
+ </Filters>
+ </RollingFile>
+ </appenders>
+
+ <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
+ <loggers>
+ <!-- 设置对打印sql语句的支持 -->
+ <logger name="java.sql" level="info" additivity="false">
+ <appender-ref ref="Console"/>
+ </logger>
+ <!--建立一个默认的root的logger-->
+ <root level="${output_log_level}">
+ <appender-ref ref="RollingFile"/>
+ <appender-ref ref="Console"/>
+ </root>
+ </loggers>
+</configuration>
--
Gitblit v1.8.0