Commit 1e366106 authored by 陈宏杰's avatar 陈宏杰

D3O

parent 4d20c0c7
...@@ -104,4 +104,14 @@ public interface RepaymentLoanInfoMapper { ...@@ -104,4 +104,14 @@ public interface RepaymentLoanInfoMapper {
List<RepaymentInfoZhuDai> repairNormalLH(@Param("planIds")List<Long> planIds); List<RepaymentInfoZhuDai> repairNormalLH(@Param("planIds")List<Long> planIds);
/**
* 查询D3逾期记录
*/
List<RepaymentInfoZhuDai> queryOverdueRecordOfD3(BaiHangTimeRecord baiHangTimeRecord);
/**
* 查询D3还款记录
*/
List<RepaymentInfoZhuDai> queryRepayMentRecordOfD3(BaiHangTimeRecord baiHangTimeRecord);
} }
...@@ -103,6 +103,10 @@ public class BaiHangFileReportService { ...@@ -103,6 +103,10 @@ public class BaiHangFileReportService {
reportD2(starTime,endTime); reportD2(starTime,endTime);
} else if ("D3".equalsIgnoreCase(type)) { } else if ("D3".equalsIgnoreCase(type)) {
reportD3(starTime,endTime); reportD3(starTime,endTime);
} else if ("D3O".equalsIgnoreCase(type)) {
reportD3O(starTime,endTime);
} else if ("D3R".equalsIgnoreCase(type)) {
reportD3R(starTime,endTime);
} else { } else {
throw new QGException(COMMON_ILLEGAL_PARAM_TOAST,"报送类型不正确"); throw new QGException(COMMON_ILLEGAL_PARAM_TOAST,"报送类型不正确");
} }
...@@ -306,6 +310,108 @@ public class BaiHangFileReportService { ...@@ -306,6 +310,108 @@ public class BaiHangFileReportService {
} }
} }
/**
* 非循环贷款贷后数据信息(D3)逾期记录
* @param startTime 开始时间
* @param endTime 截止时间
*/
private void reportD3O(String startTime, String endTime) {
List<RepaymentInfoZhuDai> repaymentLoanInfos = null;
List<String> reportList = new ArrayList<>();
reportList.add("#singleLoanRepayInfo");
Stopwatch sendWatch = Stopwatch.createStarted();
try {
Stopwatch queryStopwatch = Stopwatch.createStarted();
repaymentLoanInfos = repaymentLoanInfoMapper.queryOverdueRecordOfD3(BaiHangTimeRecord.builder().startTime(startTime).endTime(endTime).build());
log.info("量化派助贷TO百行报送(D3)-逾期记录查询结束, startTime: {} , endTime: {} , 大小: {} , 耗时: {} ", startTime, endTime, repaymentLoanInfos.size(), (queryStopwatch.stop().elapsed(TimeUnit.MILLISECONDS) / 1000) + ".s");
AtomicInteger atomicInteger = new AtomicInteger();
String id = "";
for (int i = 0; i < repaymentLoanInfos.size(); i++) {
RepaymentInfoZhuDai repaymentLoanInfo = repaymentLoanInfos.get(i);
try {
id = UUID.randomUUID().toString().replaceAll("-", "");
try {
RepaymentInfoZhuDai record = new RepaymentInfoZhuDai();
BeanUtils.copyProperties(repaymentLoanInfo, record);
record.setRecordId(id);
repaymentLoanInfoDbMapper.saveRepaymentLoanInfoLog(record);
} catch (Exception e) {
log.error("量化派助贷TO百行报送(D3)-逾期记录保存异常", e);
}
repaymentLoanInfo.setReqID(id);
repaymentLoanInfo.setName(sensitiveFilter(repaymentLoanInfo.getName()));
repaymentLoanInfo.setPid(sensitiveFilter(repaymentLoanInfo.getPid()));
repaymentLoanInfo.setMobile(sensitiveFilter(repaymentLoanInfo.getMobile()));
atomicInteger.getAndIncrement();
reportList.add(JSON.toJSONString(repaymentLoanInfo));
} catch (Exception e) {
log.error("量化派助贷TO百行报送(D3)-逾期记录处理异常, recordId: {} , loanId: {} ", id, repaymentLoanInfo.getLoanId(), e);
}
}
File file = new File("量子数科科技有限公司_D3O_"+fileNameReplaceAll(startTime.split("T")[0])+"_"+fileNameReplaceAll(endTime.split("T")[0])+"_"+String.format("%06d",new Random().nextInt(999999))+".txt");
FileUtils.writeLines(file,reportList);
if (reportList.size()<=1) {
log.info("量化派助贷TO百行报送(D3)-逾期记录为空,加密文件不生成!starTime={},endTime={}",startTime,endTime);
} else {
createFile(file.getAbsolutePath());
}
log.info("量化派助贷TO百行报送(D3)-逾期记录完成,开始时间: {} , 结束时间: {} , 实际大小: {} , 报送成功大小: {} , 耗时: {} ", startTime, endTime, repaymentLoanInfos.size(), atomicInteger.get(), sendWatch.stop().elapsed(TimeUnit.MILLISECONDS));
} catch (Exception e) {
log.error("量化派助贷TO百行报送(D3)-逾期记录处理异常,开始时间: {} , 结束时间: {} ", startTime, endTime, e);
}
}
/**
* 非循环贷款贷后数据信息(D3)还款记录
* @param startTime 开始时间
* @param endTime 截止时间
*/
private void reportD3R(String startTime, String endTime) {
List<RepaymentInfoZhuDai> repaymentLoanInfos = null;
List<String> reportList = new ArrayList<>();
reportList.add("#singleLoanRepayInfo");
Stopwatch sendWatch = Stopwatch.createStarted();
try {
Stopwatch queryStopwatch = Stopwatch.createStarted();
repaymentLoanInfos = repaymentLoanInfoMapper.queryRepayMentRecordOfD3(BaiHangTimeRecord.builder().startTime(startTime).endTime(endTime).build());
log.info("量化派助贷TO百行报送(D3)-还款记录查询结束, startTime: {} , endTime: {} , 大小: {} , 耗时: {} ", startTime, endTime, repaymentLoanInfos.size(), (queryStopwatch.stop().elapsed(TimeUnit.MILLISECONDS) / 1000) + ".s");
AtomicInteger atomicInteger = new AtomicInteger();
String id = "";
for (int i = 0; i < repaymentLoanInfos.size(); i++) {
RepaymentInfoZhuDai repaymentLoanInfo = repaymentLoanInfos.get(i);
try {
id = UUID.randomUUID().toString().replaceAll("-", "");
try {
RepaymentInfoZhuDai record = new RepaymentInfoZhuDai();
BeanUtils.copyProperties(repaymentLoanInfo, record);
record.setRecordId(id);
repaymentLoanInfoDbMapper.saveRepaymentLoanInfoLog(record);
} catch (Exception e) {
log.error("量化派助贷TO百行报送(D3)-还款记录保存异常", e);
}
repaymentLoanInfo.setReqID(id);
repaymentLoanInfo.setName(sensitiveFilter(repaymentLoanInfo.getName()));
repaymentLoanInfo.setPid(sensitiveFilter(repaymentLoanInfo.getPid()));
repaymentLoanInfo.setMobile(sensitiveFilter(repaymentLoanInfo.getMobile()));
atomicInteger.getAndIncrement();
reportList.add(JSON.toJSONString(repaymentLoanInfo));
} catch (Exception e) {
log.error("量化派助贷TO百行报送(D3)-还款记录处理异常, recordId: {} , loanId: {} ", id, repaymentLoanInfo.getLoanId(), e);
}
}
File file = new File("量子数科科技有限公司_D3R_"+fileNameReplaceAll(startTime.split("T")[0])+"_"+fileNameReplaceAll(endTime.split("T")[0])+"_"+String.format("%06d",new Random().nextInt(999999))+".txt");
FileUtils.writeLines(file,reportList);
if (reportList.size()<=1) {
log.info("量化派助贷TO百行报送(D3)-还款记录为空,加密文件不生成!starTime={},endTime={}",startTime,endTime);
} else {
createFile(file.getAbsolutePath());
}
log.info("量化派助贷TO百行报送(D3)-还款记录完成,开始时间: {} , 结束时间: {} , 实际大小: {} , 报送成功大小: {} , 耗时: {} ", startTime, endTime, repaymentLoanInfos.size(), atomicInteger.get(), sendWatch.stop().elapsed(TimeUnit.MILLISECONDS));
} catch (Exception e) {
log.error("量化派助贷TO百行报送(D3)-还款记录处理异常,开始时间: {} , 结束时间: {} ", startTime, endTime, e);
}
}
/** /**
* 根据传入的文件路径将加密后的文件生成到 {@link BaiHangFileReportService#HOST_PATH}中 * 根据传入的文件路径将加密后的文件生成到 {@link BaiHangFileReportService#HOST_PATH}中
* @param filePath 需要加密的文件路径 * @param filePath 需要加密的文件路径
......
...@@ -961,5 +961,164 @@ ...@@ -961,5 +961,164 @@
GROUP BY if(d.order_no IS NULL, a.loan_application_history_id, d.order_no), if(DATEDIFF(a.next_deadline, a.repaid_at) > 1, a.term_no, h.max_term); GROUP BY if(d.order_no IS NULL, a.loan_application_history_id, d.order_no), if(DATEDIFF(a.next_deadline, a.repaid_at) > 1, a.term_no, h.max_term);
</select> </select>
<select id="queryOverdueRecordOfD3" parameterType="cn.quantgroup.report.domain.baihang.BaiHangTimeRecord"
resultType="cn.quantgroup.report.domain.baihang.RepaymentInfoZhuDai">
select
a.id reqID
,'A' opCode
,DATE_FORMAT(now(),'%Y-%m-%dT%H:%i:%S') uploadTs
,if(d.order_no is null,a.loan_application_history_id,d.order_no) loanId
,b.name name
,b.id_no pid
,b.phone_no mobile
,a.term_no termNo
,z.repayment_Date targetRepaymentDate
,'' realRepaymentDate
,a.required_repayment plannedPayment
,f.yqze targetRepayment
,0 realRepayment
,case when f.yqze=0 then ''
else concat('D',DATEDIFF(z.received_at,f.min_deadline)+1) end overdueStatus
,DATE_FORMAT(z.received_at,'%Y-%m-%dT%H:%i:%S') statusConfirmAt
,f.yqze overdueAmount
,i.dkye remainingAmount
,case when f.yqze>0 then '2'
when i.dkye=0 then '3'
when f.yqze=0 and i.dkye>0 then '1'
end as loanStatus
,'overdue' termStatus
from (select a.*
from vxyqb.repayment_plan a
left join vxyqb.loan_application_manifest_history b
on a.loan_application_history_id=b.loan_application_history_id and b.loan_paid_at >= #{startTime,jdbcType=VARCHAR} and b.loan_paid_at &lt; #{endTime,jdbcType=VARCHAR}
where (a.repayment_status !=3 or (a.repayment_status =3 and a.repaid_at>=a.deadline))
and b.funding_corp_id in (1080,100040,1030,100030)
and b.transaction_status in (2,5)
and b.contract_term not in (2,3)) a
left join vxyqb_user.user_detail b on a.user_id=b.user_id
left join vxyqb.loan_account_ext c on a.loan_application_history_id=c.loan_id
left join vxyqb.apply_quota_record d on c.order_no=d.order_no
left join (select a.loan_application_history_id,a.term_no
,sum(if((a.repayment_status !=3 or (a.repayment_status =3 and a.deadline &lt; c.repayment_received_at)),if(b.loan_paid_at>='2018-01-01',g.principal+g.interest+g.service_fee,h.principle+h.interest+h.service_fee_per_term),0)) yqze
,min(if((a.repayment_status !=3 or (a.repayment_status =3 and a.deadline &lt; c.repayment_received_at)),c.deadline,null)) min_deadline
from vxyqb.repayment_plan a
left join vxyqb.loan_application_manifest_history b
on a.loan_application_history_id=b.loan_application_history_id and b.loan_paid_at >= #{startTime,jdbcType=VARCHAR} and b.loan_paid_at &lt; #{endTime,jdbcType=VARCHAR}
left join vxyqb.repayment_record g on a.id=g.repayment_plan_id
left join vxyqb.plan_amount_detail h on a.id=h.plan_id
left join vxyqb.repayment_plan c on a.loan_application_history_id=c.loan_application_history_id
and a.term_no>=c.term_no
where b.funding_corp_id in (1080,100040,1030,100030)
group by a.loan_application_history_id,a.term_no) f on a.loan_application_history_id=f.loan_application_history_id and a.term_no=f.term_no
left join vxyqb.repayment_record g on a.id=g.repayment_plan_id
left join (
select a.loan_application_history_id,a.term_no,if(TO_DAYS(IFNULL(a.repayment_received_at,NOW()))!=TO_DAYS(date(DATE_sub(a.deadline,INTERVAL 1 second))),a.deadline,a.repayment_received_at)
,sum(if(a.repayment_status !=3 or (a.repayment_status =3 and if(TO_DAYS(IFNULL(a.repayment_received_at,NOW()))!=TO_DAYS(date(DATE_sub(a.deadline,INTERVAL 1 second))),a.deadline,a.repayment_received_at) &lt; g.repayment_received_at),if(b.loan_paid_at>='2018-01-01',g.principal,h.principle),0)) dkye
from vxyqb.repayment_plan a
left join vxyqb.loan_application_manifest_history b
on a.loan_application_history_id=b.loan_application_history_id and b.loan_paid_at >= #{startTime,jdbcType=VARCHAR} and b.loan_paid_at &lt; #{endTime,jdbcType=VARCHAR}
left join vxyqb.repayment_record g on a.loan_application_history_id=g.loan_application_history_id
left join vxyqb.plan_amount_detail h on a.id=h.plan_id
where b.funding_corp_id in (1080,100040,1030,100030)
group by a.loan_application_history_id,a.term_no
) i on a.loan_application_history_id=i.loan_application_history_id and a.term_no=i.term_no
left join (
select a.loan_application_history_id,a.term_no,date(DATE_sub(a.deadline,INTERVAL 1 second)) repayment_Date,
if(TO_DAYS(IFNULL(a.repayment_received_at,NOW()))!=TO_DAYS(date(DATE_sub(a.deadline,INTERVAL 1 second))),a.deadline,a.repayment_received_at) received_at
from vxyqb.repayment_plan a
left join vxyqb.loan_application_manifest_history b
on a.loan_application_history_id=b.loan_application_history_id and b.loan_paid_at >= #{startTime,jdbcType=VARCHAR} and b.loan_paid_at &lt; #{endTime,jdbcType=VARCHAR}
where b.funding_corp_id in (1080,100040,1030,100030)
group by a.loan_application_history_id,a.term_no
) z on a.loan_application_history_id=z.loan_application_history_id and a.term_no=z.term_no
</select>
<select id="queryRepayMentRecordOfD3" parameterType="cn.quantgroup.report.domain.baihang.BaiHangTimeRecord"
resultType="cn.quantgroup.report.domain.baihang.RepaymentInfoZhuDai">
select
a.id reqID
,'A' opCode
,DATE_FORMAT(now(),'%Y-%m-%dT%H:%i:%S') uploadTs
,if(d.order_no is null,a.loan_application_history_id,d.order_no) loanId
,b.name name
,b.id_no pid
,b.phone_no mobile,if(DATEDIFF(a.next_deadline,a.repaid_at)>1,a.term_no,h.max_term) termNo
,date(DATE_sub(if(DATEDIFF(a.next_deadline,a.repaid_at)>1,a.deadline,h.max_deadline),INTERVAL 1 second)) targetRepaymentDate
,DATE_FORMAT(a.repaid_at,'%Y-%m-%dT%H:%i:%S') realRepaymentDate
,j.required_repayment plannedPayment
,f.yqze+sum(a.required_repayment) targetRepayment
,sum(a.required_repayment) realRepayment
,case when f.yqze=0 then ''
else concat('D',DATEDIFF(a.repaid_at,f.min_deadline)+1) end overdueStatus
,DATE_FORMAT(a.repayment_received_at,'%Y-%m-%dT%H:%i:%S') statusConfirmAt
,f.yqze overdueAmount
,i.dkye remainingAmount
,case when f.yqze>0 then '2'
when i.dkye=0 and if(DATEDIFF(a.next_deadline,a.repaid_at)>1,a.term_no,h.max_term) &lt; f.max_term_no then '2'
when i.dkye=0 and if(DATEDIFF(a.next_deadline,a.repaid_at)>1,a.term_no,h.max_term)= f.max_term_no then '3'
when f.yqze=0 and i.dkye>0 then '1'
end as loanStatus
,if(f.yqze>0,'overdue','normal') termStatus
from (
select a.*,if(c.term_no is null,a.term_no,c.term_no) next_term
,if(c.deadline is null,a.deadline,c.deadline) next_deadline
from vxyqb.repayment_plan a
left join vxyqb.loan_application_manifest_history b
on a.loan_application_history_id=b.loan_application_history_id and b.loan_paid_at &lt; #{endTime,jdbcType=VARCHAR}
left join vxyqb.repayment_plan c on a.loan_application_history_id=c.loan_application_history_id
and a.term_no=c.term_no-1
where a.repaid_at>=#{startTime,jdbcType=VARCHAR} and a.repaid_at &lt; #{endTime,jdbcType=VARCHAR} and a.repayment_status=3
and b.funding_corp_id in (1080,100040,1030,100030)
and b.contract_term not in (2,3)
) a
left join vxyqb_user.user_detail b on a.user_id=b.user_id
left join vxyqb.loan_account_ext c on a.loan_application_history_id=c.loan_id
left join vxyqb.apply_quota_record d on c.order_no=d.order_no
left join (
select a.loan_application_history_id,a.term_no
,sum(if((a.repayment_status !=3 or (a.repayment_status =3 and a.repaid_at>=c.deadline)) and a.deadline &lt;= c.deadline,a.required_repayment,0)) yqze
,sum(if(a.repayment_status !=3 or (a.repayment_status =3 and a.repaid_at>=#{endTime,jdbcType=VARCHAR}),if(b.loan_paid_at>='2018-01-01',g.principal,h.principle),0)) dkye
,min(if((a.repayment_status !=3 or (a.repayment_status =3 and a.repaid_at>=c.deadline)) and a.deadline &lt;= c.deadline,c.deadline,null)) min_deadline
,max(a.term_no) max_term_no
from vxyqb.repayment_plan a
left join vxyqb.loan_application_manifest_history b
on a.loan_application_history_id=b.loan_application_history_id
left join vxyqb.repayment_record g on a.id=g.repayment_plan_id
left join vxyqb.plan_amount_detail h on a.id=h.plan_id
left join vxyqb.repayment_plan c on a.loan_application_history_id=c.loan_application_history_id
and a.term_no &lt; c.term_no
where a.repaid_at>=#{startTime,jdbcType=VARCHAR} and a.repaid_at &lt; #{endTime,jdbcType=VARCHAR} and b.funding_corp_id in (1080,100040,1030,100030)
group by a.loan_application_history_id,a.term_no) f on a.loan_application_history_id=f.loan_application_history_id and a.term_no=f.term_no
left join vxyqb.repayment_record g on a.id=g.repayment_plan_id
left join (
select a.loan_application_history_id,a.repaid_at,a.deadline,a.term_no
,max(c.term_no) max_term
,max(c.deadline) max_deadline
from vxyqb.repayment_plan a
left join vxyqb.loan_application_manifest_history b
on a.loan_application_history_id=b.loan_application_history_id and b.loan_paid_at &lt; #{endTime,jdbcType=VARCHAR}
left join vxyqb.repayment_plan c on a.loan_application_history_id=c.loan_application_history_id
where a.repaid_at>=#{startTime,jdbcType=VARCHAR} and a.repaid_at &lt; #{endTime,jdbcType=VARCHAR} and DATEDIFF(a.repaid_at,c.deadline)>=-1
and b.funding_corp_id in (1080,100040,1030,100030)
group by a.loan_application_history_id,a.term_no) h
on a.loan_application_history_id=h.loan_application_history_id and a.term_no=h.term_no
left join (
select a.loan_application_history_id
,a.term_no
,sum(if(d.term_no>a.term_no,d.principal,0)) dkye
from vxyqb.repayment_plan a
left join vxyqb.loan_application_manifest_history b
on a.loan_application_history_id=b.loan_application_history_id and b.loan_paid_at &lt; #{endTime,jdbcType=VARCHAR}
left join vxyqb.repayment_record d on a.loan_application_history_id=d.loan_application_history_id
where a.repaid_at>=#{startTime,jdbcType=VARCHAR} and a.repaid_at &lt; #{endTime,jdbcType=VARCHAR} and b.funding_corp_id in (1080,100040,1030,100030)
group by a.loan_application_history_id,a.term_no) i
on a.loan_application_history_id=i.loan_application_history_id and a.term_no=i.term_no
left join vxyqb.repayment_plan j on a.loan_application_history_id=j.loan_application_history_id
and if(DATEDIFF(a.next_deadline,a.repaid_at)>1,a.term_no,a.term_no)=j.term_no
group by if(d.order_no is null,a.loan_application_history_id,d.order_no),
if(DATEDIFF(a.next_deadline,a.repaid_at)>1,a.term_no,a.term_no)
</select>
</mapper> </mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment