Commit 56a84279 authored by 郑建's avatar 郑建

增加报送播报

parent 4e459deb
package cn.quantgroup.report.domain.baihang;
import cn.quantgroup.report.enums.ReportType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author jian.zheng
* @date 2021/3/15 - 17:05
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ReportResult {
/**
* 总数
*/
private int totalNum;
/**
* 成功数量
*/
private int successNum;
/**
* 跳过数量
*/
private int skipNum;
/**
* 报送类型
*/
private ReportType type;
/**
* 兼容老的消息
*/
private String msg;
}
package cn.quantgroup.report.enums;
import lombok.Getter;
/**
* @author jian.zheng
* @date 2021/3/15 - 17:06
**/
public enum ReportType {
/**
* 放款
*/
LOAN("放款"),
/**
* 还款
*/
REPAYMENT("还款"),
/**
* 联合贷放款
*/
LHD_LOAN("放款"),
/**
* 联合贷还款
*/
LHD_REPAYMENT("还款"),
;
@Getter
private String name;
ReportType(String name) {
this.name = name;
}
}
package cn.quantgroup.report.job; package cn.quantgroup.report.job;
import cn.quantgroup.report.domain.baihang.ReportResult;
import cn.quantgroup.report.service.baihang.BaiHangZhuDaiService; import cn.quantgroup.report.service.baihang.BaiHangZhuDaiService;
import cn.quantgroup.report.service.baihang.constant.Constant; import cn.quantgroup.report.service.baihang.constant.Constant;
import cn.quantgroup.report.utils.dingtalk.DingTalk; import cn.quantgroup.report.utils.dingtalk.DingTalk;
...@@ -64,22 +65,22 @@ public class QuantGroupZhuDaiReportToBaiHang { ...@@ -64,22 +65,22 @@ public class QuantGroupZhuDaiReportToBaiHang {
String msg_A1 = baiHangZhuDaiService.sendZhuDaiApplyToBaiHang(startnyr,endnyr); //生产 助贷-贷款申请 报送T+1 暂时先不报送C1 因为百行还没有开放查询接口 String msg_A1 = baiHangZhuDaiService.sendZhuDaiApplyToBaiHang(startnyr,endnyr); //生产 助贷-贷款申请 报送T+1 暂时先不报送C1 因为百行还没有开放查询接口
dingTalk.talk("Info","报送"+startnyr+"申请A1结束",msg_A1); dingTalk.talk("Info","报送"+startnyr+"申请A1结束",msg_A1);
if(msg_A1.indexOf("[false]")!=-1){ if(msg_A1.contains("[false]")){
dingTalk.talk_ToUser("申请A1报送失败", "报送"+startnyr+"申请A1有部分失败,请尽快手动处理!"); dingTalk.talk_ToUser("申请A1报送失败", "报送"+startnyr+"申请A1有部分失败,请尽快手动处理!");
} }
//暂无放款报送 暂时关闭 //放款
// String msg_D2 = baiHangZhuDaiService.sendZhuDaiLoanToBaiHang(startnyr,endnyr); //生产 助贷-放款信息 报送T+1 ReportResult loanResult = baiHangZhuDaiService.sendZhuDaiLoanToBaiHang(startnyr,endnyr); //生产 助贷-放款信息 报送T+1
// dingTalk.talk("Info","报送"+startnyr+"放款D2结束",msg_D2); String msg_D2 = loanResult.getMsg();
// if(msg_D2.indexOf("[false]")!=-1){ dingTalk.talk("Info","报送"+startnyr+"放款D2结束",msg_D2);
// dingTalk.talk_ToUser("放款D2报送失败", "报送"+startnyr+"放款D2有部分失败,请尽快手动处理!"); if(msg_D2.contains("[false]")){
// } dingTalk.talk_ToUser("放款D2报送失败", "报送"+startnyr+"放款D2有部分失败,请尽快手动处理!");
}
String msg_D3 =baiHangZhuDaiService.sendZhuDaiRepaymentToBaiHang(startnyr,endnyr); //生产 助贷-还款&逾期信息 报送T+1 //还款
String msg_D3 = baiHangZhuDaiService.sendZhuDaiRepaymentToBaiHang(startnyr,endnyr); //生产 助贷-还款&逾期信息 报送T+1
dingTalk.talk("Info","报送"+startnyr+"还款D3结束",msg_D3); dingTalk.talk("Info","报送"+startnyr+"还款D3结束",msg_D3);
if(msg_D3.indexOf("[false]")!=-1){ if(msg_D3.contains("[false]")){
dingTalk.talk_ToUser("还款D3报送失败", "报送"+startnyr+"还款D3有部分失败,请尽快手动处理!"); dingTalk.talk_ToUser("还款D3报送失败", "报送"+startnyr+"还款D3有部分失败,请尽快手动处理!");
} }
log.info("量化派-助贷模式报送贷款信息结束, newTime: {}, 耗时: {} , msg: {} ", LocalDateTime.now(), stopwatch.stop().elapsed(TimeUnit.MILLISECONDS), (msg_A1 + msg_D3)); log.info("量化派-助贷模式报送贷款信息结束, newTime: {}, 耗时: {} , msg: {} ", LocalDateTime.now(), stopwatch.stop().elapsed(TimeUnit.MILLISECONDS), (msg_A1 + msg_D3));
}catch (Exception e){ }catch (Exception e){
......
...@@ -2,6 +2,7 @@ package cn.quantgroup.report.service.baihang; ...@@ -2,6 +2,7 @@ package cn.quantgroup.report.service.baihang;
import cn.quantgroup.report.domain.baihang.*; import cn.quantgroup.report.domain.baihang.*;
import cn.quantgroup.report.domain.master.RepaymentLoanWhiteList; import cn.quantgroup.report.domain.master.RepaymentLoanWhiteList;
import cn.quantgroup.report.enums.ReportType;
import cn.quantgroup.report.mapper.baihang.ApplyLoanInfoMapper; import cn.quantgroup.report.mapper.baihang.ApplyLoanInfoMapper;
import cn.quantgroup.report.mapper.baihang.LoanInfoMapper; import cn.quantgroup.report.mapper.baihang.LoanInfoMapper;
import cn.quantgroup.report.mapper.baihang.RepaymentLoanInfoMapper; import cn.quantgroup.report.mapper.baihang.RepaymentLoanInfoMapper;
...@@ -45,6 +46,8 @@ import org.springframework.stereotype.Service; ...@@ -45,6 +46,8 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.security.PublicKey; import java.security.PublicKey;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
...@@ -138,6 +141,9 @@ public class BaiHangZhuDaiService { ...@@ -138,6 +141,9 @@ public class BaiHangZhuDaiService {
//众信利民助贷报送的资方id //众信利民助贷报送的资方id
private static Integer[] fundingCorpIds ={420, 520, 580, 650, 670, 810, 240, 640, 700}; //"420,520,580,650,670,810,240,640,700" private static Integer[] fundingCorpIds ={420, 520, 580, 650, 670, 810, 240, 640, 700}; //"420,520,580,650,670,810,240,640,700"
private static final String branchTemplate = "%s 报送 : \n 成功 %s 条,失败 %s 条,白名单跳过 %s 条";
private static final String rootTemplate = "%s \n %s \n %s";
@PostConstruct @PostConstruct
public void init() { public void init() {
...@@ -149,22 +155,6 @@ public class BaiHangZhuDaiService { ...@@ -149,22 +155,6 @@ public class BaiHangZhuDaiService {
} catch (Exception e) { } catch (Exception e) {
log.error("初始化百行助贷PublicKey实例", e); log.error("初始化百行助贷PublicKey实例", e);
} }
/*try{
long log_stUtc2 = System.currentTimeMillis();
List<String> contextList = FileUtils.readLines(new File(zl_file_path_name + "TEST_BS_USER_TM_201911061315.txt"), "utf-8");
if(contextList!=null && contextList.size()>0){
Map<String,String> tmpMap = new ConcurrentHashMap<>(contextList.size());
for(String context: contextList){
String[] tmp = context.split("=");
tmpMap.put(tmp[0],tmp[1]);
}
testBaoSongUserInfoTuoMingMap = tmpMap;
}
log.info("初始化测试环境百行报送-用户三要素脱敏字典结束, 耗时: {} ",System.currentTimeMillis()-log_stUtc2);
}catch(Exception e){
log.error("初始化测试环境百行报送-用户三要素脱敏字典异常", e);
}*/
} }
private static PublicKey getBaihangZDPublickey() { private static PublicKey getBaihangZDPublickey() {
...@@ -246,7 +236,7 @@ public class BaiHangZhuDaiService { ...@@ -246,7 +236,7 @@ public class BaiHangZhuDaiService {
* 助贷模式-实时批量报送放款D2数据 * 助贷模式-实时批量报送放款D2数据
* Scheduled 实时放款数据(百行征信报送) * Scheduled 实时放款数据(百行征信报送)
*/ */
public String sendZhuDaiLoanToBaiHang(String startnyr, String endnyr) { public ReportResult sendZhuDaiLoanToBaiHang(String startnyr, String endnyr) {
log.info("量化派助贷TO百行报送T+1放款开始..."); log.info("量化派助贷TO百行报送T+1放款开始...");
//yyyy-MM-dd //yyyy-MM-dd
BaiHangTimeRecord timeRecord = BaiHangTimeRecord.builder().startTime(startnyr).endTime(endnyr).build(); BaiHangTimeRecord timeRecord = BaiHangTimeRecord.builder().startTime(startnyr).endTime(endnyr).build();
...@@ -373,7 +363,14 @@ public class BaiHangZhuDaiService { ...@@ -373,7 +363,14 @@ public class BaiHangZhuDaiService {
String resMsgTemp = "放款报送:查询 %d条(联合贷%d条), 报送成功 %d条, 存日志 %d条;"; String resMsgTemp = "放款报送:查询 %d条(联合贷%d条), 报送成功 %d条, 存日志 %d条;";
resMsgTemp += "[" + (loanInfos.size() == succ_atomicInteger.get()) + "]"; resMsgTemp += "[" + (loanInfos.size() == succ_atomicInteger.get()) + "]";
return String.format(resMsgTemp, loanInfos.size(), loanInfosLhSize, succ_atomicInteger.get(), save_atomicInteger.get()); String msg = String.format(resMsgTemp, loanInfos.size(), loanInfosLhSize, succ_atomicInteger.get(), save_atomicInteger.get());
ReportResult loanResult = ReportResult.builder()
.type(ReportType.LOAN)
.successNum(succ_atomicInteger.get())
.totalNum(loanInfos.size())
.build();
dingTalk.talkToLeader("Info","众信利民-百行报送",combineLeaderReport(loanResult,null,startnyr,endnyr));
return ReportResult.builder().msg(msg).successNum(succ_atomicInteger.get()).totalNum(loanInfos.size()).type(ReportType.LHD_LOAN).build();
} }
...@@ -388,7 +385,8 @@ public class BaiHangZhuDaiService { ...@@ -388,7 +385,8 @@ public class BaiHangZhuDaiService {
String resMsg = ""; String resMsg = "";
String temp_huanKuan = "还款报送:查询 %d条(联合贷%d条), 实际 %d条, 跳过 %d条, 报送成功 %d条, 存日志 %d条;"; String temp_huanKuan = "还款报送:查询 %d条(联合贷%d条), 实际 %d条, 跳过 %d条, 报送成功 %d条, 存日志 %d条;";
String temp_yuQi = "逾期报送:查询 %d条(联合贷%d条), 实际 %d条, 跳过 %d条, 报送成功 %d条, 存日志 %d条;"; String temp_yuQi = "逾期报送:查询 %d条(联合贷%d条), 实际 %d条, 跳过 %d条, 报送成功 %d条, 存日志 %d条;";
ReportResult normalResult = null;
ReportResult overdueResult = new ReportResult();
for (int j = 0; j < 2; j++) { for (int j = 0; j < 2; j++) {
Stopwatch sendWatch = Stopwatch.createStarted(); Stopwatch sendWatch = Stopwatch.createStarted();
try { try {
...@@ -505,13 +503,27 @@ public class BaiHangZhuDaiService { ...@@ -505,13 +503,27 @@ public class BaiHangZhuDaiService {
log.info("量化派助贷TO百行报送-还款申请完成 J: {} , 开始时间: {} , 结束时间: {} , list大小: {} , 实际大小: {} , 跳过: {} , 报送成功大小: {} , 保存日志: {} , 耗时: {} ", j, startnyr, endnyr, repaymentLoanInfos.size(), totail_atomicInt.get(), tg_atomicInt.get(), succ_atomicInt.get(), saveLog_atomicInt.get(), (sendWatch.stop().elapsed(TimeUnit.MILLISECONDS) / 1000) + ".s"); log.info("量化派助贷TO百行报送-还款申请完成 J: {} , 开始时间: {} , 结束时间: {} , list大小: {} , 实际大小: {} , 跳过: {} , 报送成功大小: {} , 保存日志: {} , 耗时: {} ", j, startnyr, endnyr, repaymentLoanInfos.size(), totail_atomicInt.get(), tg_atomicInt.get(), succ_atomicInt.get(), saveLog_atomicInt.get(), (sendWatch.stop().elapsed(TimeUnit.MILLISECONDS) / 1000) + ".s");
if (j == 0) { if (j == 0) {
resMsg += String.format(temp_huanKuan, repaymentLoanInfos.size(), (repaymentLoanInfosLh != null ? repaymentLoanInfosLh.size() : 0), totail_atomicInt.get(), tg_atomicInt.get(), succ_atomicInt.get(), saveLog_atomicInt.get()); resMsg += String.format(temp_huanKuan, repaymentLoanInfos.size()
, (repaymentLoanInfosLh != null ? repaymentLoanInfosLh.size() : 0)
, totail_atomicInt.get(), tg_atomicInt.get(), succ_atomicInt.get(), saveLog_atomicInt.get());
normalResult = ReportResult.builder()
.type(ReportType.REPAYMENT)
.totalNum(totail_atomicInt.get())
.successNum(succ_atomicInt.get())
.skipNum(tg_atomicInt.get())
.build();
} else { } else {
resMsg += "\n"; resMsg += "\n";
resMsg += String.format(temp_yuQi, repaymentLoanInfos.size(), (repaymentLoanInfosLh != null ? repaymentLoanInfosLh.size() : 0), totail_atomicInt.get(), tg_atomicInt.get(), succ_atomicInt.get(), saveLog_atomicInt.get()); resMsg += String.format(temp_yuQi, repaymentLoanInfos.size(), (repaymentLoanInfosLh != null ? repaymentLoanInfosLh.size() : 0), totail_atomicInt.get(), tg_atomicInt.get(), succ_atomicInt.get(), saveLog_atomicInt.get());
overdueResult = ReportResult.builder()
.type(ReportType.REPAYMENT)
.totalNum(totail_atomicInt.get())
.successNum(succ_atomicInt.get())
.skipNum(tg_atomicInt.get())
.build();
} }
resMsg += "[" + (totail_atomicInt.get() == succ_atomicInt.get()) + "]"; resMsg += "[" + (totail_atomicInt.get() == succ_atomicInt.get()) + "]";
dingTalk.talkToLeader("Info","众信利民-百行报送",combineLeaderReport(normalResult,overdueResult,startnyr,endnyr));
} catch (Exception e) { } catch (Exception e) {
log.error("量化派助贷TO百行报送-异常 J: {} , 开始时间: {} , 结束时间: {} ", j, startnyr, endnyr, e); log.error("量化派助贷TO百行报送-异常 J: {} , 开始时间: {} , 结束时间: {} ", j, startnyr, endnyr, e);
dingTalk.talk("Error","量化派助贷TO百行报送-"+(j==0?"还款":"逾期")+"信息异常", e); dingTalk.talk("Error","量化派助贷TO百行报送-"+(j==0?"还款":"逾期")+"信息异常", e);
...@@ -522,6 +534,27 @@ public class BaiHangZhuDaiService { ...@@ -522,6 +534,27 @@ public class BaiHangZhuDaiService {
return resMsg; return resMsg;
} }
private static String combineLeaderReport(ReportResult normal,ReportResult overdue,String startDate,String endDate){
try {
String rateTemplate = "成功报送-上报总数: %s ,正常还款数: %s ,逾期还款数: %s ,逾期占比: %s";
String date = String.format("%s - %s",startDate,endDate);
String rate = null;
String branch = String.format(branchTemplate,normal.getType().getName(),normal.getTotalNum()
,normal.getTotalNum() - normal.getSuccessNum(),0);
if (overdue != null){
int total = normal.getSuccessNum()+overdue.getSuccessNum();
rate = String.format(rateTemplate,total
,normal.getSuccessNum(),overdue.getSuccessNum()
,new BigDecimal(overdue.getSuccessNum()).divide(new BigDecimal(total),2, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100)).toString() + "%");
}
return String.format(rootTemplate,date,branch,StringUtils.isEmpty(rate)?"":rate);
}catch (Exception e){
log.error("talkToLeader出错",e);
return "";
}
}
/** /**
* 描述: 逾期还款报送,是否在白名单检测 <br/> * 描述: 逾期还款报送,是否在白名单检测 <br/>
* 参数: [repaymentLoanInfo, type] <br/> * 参数: [repaymentLoanInfo, type] <br/>
......
...@@ -30,6 +30,8 @@ public class DingTalk { ...@@ -30,6 +30,8 @@ public class DingTalk {
//量化派2百行 //量化派2百行
public static final String webHook = "https://oapi.dingtalk.com/robot/send?access_token=ef3cafb299ec6cb7442b2795d4d0c48e940756f7f267cfa895dbb419adb00128"; public static final String webHook = "https://oapi.dingtalk.com/robot/send?access_token=ef3cafb299ec6cb7442b2795d4d0c48e940756f7f267cfa895dbb419adb00128";
public static final String LEADER_WEB_HOOK = "https://oapi.dingtalk.com/robot/send?access_token=d851fef9aa00aa74dba08aa3f558f90b28f7ab6081afa0ba96cdf33c4d3414bd";
@Async @Async
public void talk(String alarmLevel, String msgTitle, String msgContent) { public void talk(String alarmLevel, String msgTitle, String msgContent) {
...@@ -47,6 +49,22 @@ public class DingTalk { ...@@ -47,6 +49,22 @@ public class DingTalk {
} }
} }
@Async
public void talkToLeader(String alarmLevel, String msgTitle, String msgContent) {
try{
Map<String, String> param = new HashMap<>();
param.put("webhook", LEADER_WEB_HOOK);
param.put("alarmLevel", alarmLevel);//"Warn"
param.put("msgTitle", "众信利民-百行报送:" + msgTitle);
param.put("msgContent", msgContent);
// param.put("toUsers", "15542661376,18612632691");
String resp = iHttpService.post(talkUri, param);
log.info("钉钉报警接口调用结束, resp: {} ", resp);
}catch (Exception e){
log.warn("钉钉报警接口调用异常! ",e);
}
}
@Async @Async
public void talk(String alarmLevel, String msgTitle, Exception e) { public void talk(String alarmLevel, String msgTitle, Exception e) {
try{ try{
......
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