Compare commits

..

No commits in common. "4e163d3c4c86ccff448bea7b47f21ab5547142b1" and "37ca8a6c8f1001acc739e9f9d44ac11e0022e8d4" have entirely different histories.

22 changed files with 201 additions and 576 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,32 +1,27 @@
FROM openjdk:11.0.14-jdk
ENV TZ=Asia/Shanghai
# 设置时区和环境变量
ENV TZ=Asia/Shanghai \
JAVA_OPTS="-Dserver.port=8090 \
ENV JAVA_OPTS="-Dserver.port=8090 \
-Dspring.profiles.active=sit \
-Dspring.cloud.nacos.config.namespace=dx-action-feature \
-Dspring.cloud.nacos.config.server-addr=172.16.0.98:8848 \
-Dspring.cloud.nacos.config.server-addr=10.246.8.9:8848 \
-Dspring.cloud.nacos.config.username=nacos \
-Dspring.cloud.nacos.config.password=PwBCrYhX6JfKNTi \
-Dspring.cloud.nacos.config.password=nacos \
-Dspring.cloud.nacos.discovery.namespace=dx-action-feature \
-Dspring.cloud.nacos.discovery.server-addr=172.16.0.98:8848 \
-Dspring.cloud.nacos.discovery.server-addr=10.246.8.9:8848 \
-Dspring.cloud.nacos.discovery.username=nacos \
-Dspring.cloud.nacos.discovery.password=PwBCrYhX6JfKNTi \
-Dspring.cloud.nacos.discovery.password=nacos \
-Ddruid.mysql.usePingMethod=false \
-Xmx4g -Xms4g -Xmn1g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m"
# 设置时区并创建所需目录
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone && \
mkdir -p /batch /home/rcs /home/appusr /upload /home/nas
# 添加数据卷
VOLUME ["/home/rcs", "/upload", "/home/appusr", "/home/nas"]
# 设置工作目录和暴露端口
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /batch
RUN mkdir -p /home/rcs
RUN mkdir -p /home/appusr
RUN mkdir -p /upload
VOLUME ["/home/rcs","/upload"]
WORKDIR /batch
EXPOSE 8090 8100
EXPOSE 8090
# 添加应用 JAR 文件并设置启动命令
ADD ./target/loan-batch.jar ./
CMD java $JAVA_OPTS -jar loan-batch.jar

View File

@ -1,11 +1,10 @@
server.port=8090
spring.application.name=loan-batch
#spring.profiles.active=sit
spring.profiles.active=sit
spring.cloud.nacos.config.namespace=cc-dev-feature
spring.cloud.nacos.config.server-addr=47.119.166.103:8848
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=PwBCrYhX6JfKNTi
spring.cloud.nacos.config.server-addr=10.99.67.59:8848
spring.cloud.nacos.config.username=gwb
spring.cloud.nacos.config.password=2jeauyCu6Yhu
spring.cloud.nacos.config.namespace=gwb-sit
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.config.server-addr}
spring.cloud.nacos.discovery.username=${spring.cloud.nacos.config.username}
@ -15,9 +14,3 @@ spring.cloud.nacos.discovery.service=${spring.application.name}
spring.main.allow-bean-definition-overriding=true
server.servlet.session.cookie.http-only=true
#server.tongWeb.license.type=file
#server.tongWeb.license.path=classpath:tongweb/license.dat
#server.tongWeb.uri-encoding=utf-8
#server.tongWeb.max-threads=800
logging.level.com.zkj.rcs.sys.mapper=debug
knife4j.basic.enable=true

View File

@ -3,7 +3,6 @@ package com.zkj.loan.batch.tasklet;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zkj.loan.common.internet.mapper.sys.SysMqRecordMapper;
import com.zkj.loan.common.internet.model.sys.SysMqRecord;
import com.zkj.loan.common.internet.service.sys.impl.SysMqRecordServiceImpl;
import com.zkj.loan.common.internet.utils.DateUtil;
import com.zkj.rcs.scheduler.model.JobReqEntity;
import lombok.extern.slf4j.Slf4j;
@ -24,8 +23,6 @@ public abstract class MsxfContractBatchTasklet extends AbstractBatchTasklet {
@Resource
private SysMqRecordMapper sysMqRecordMapper;
@Resource
private SysMqRecordServiceImpl sysMqRecordService;
public String getDate(JobReqEntity jobReqEntity) {
return (String) jobReqEntity.getJobParameter().get("tranDate");
@ -86,14 +83,6 @@ public abstract class MsxfContractBatchTasklet extends AbstractBatchTasklet {
log.info("任务耗时:{} 毫秒", end - start);
}
public boolean updateSysMqRecordStatus(SysMqRecord recordsToUpdate) {
long start = System.currentTimeMillis();
boolean b = sysMqRecordService.updateById(recordsToUpdate);
long end = System.currentTimeMillis();
log.info("bizNo: {} 更新 sys_mq_record 状态,更新状态:{},任务耗时:{} 毫秒", recordsToUpdate.getBizNo(), b, end - start);
return b;
}
public String getFileType(JobReqEntity jobReqEntity) {
return (String) jobReqEntity.getJobParameter().get("fileType");
}

View File

@ -13,37 +13,26 @@ import com.zkj.loan.batch.util.JsonUtil;
import com.zkj.loan.common.internet.feign.MsxfSftpClient;
import com.zkj.loan.common.internet.feign.pojo.MsxfSftpRespVO;
import com.zkj.loan.common.internet.mapper.sys.SysMqRecordMapper;
import com.zkj.loan.common.internet.model.fac.LoanDuebill;
import com.zkj.loan.common.internet.model.pay.PayUseCreditExt;
import com.zkj.loan.common.internet.model.sys.SysMqRecord;
import com.zkj.loan.common.internet.service.contract.entity.ContractConst;
import com.zkj.loan.common.internet.service.tranfer.FileTransferService;
import com.zkj.loan.common.internet.utils.DateUtil;
import com.zkj.loan.common.internet.utils.ZipUtils;
import com.zkj.open.api.client.feign.api.Result;
import com.zkj.rcs.common.core.util.seq.IdGenerator;
import com.zkj.rcs.scheduler.model.JobReqEntity;
import com.zkj.rcs.scheduler.model.JobRespEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.io.File;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.stream.Collectors;
import static com.zkj.loan.batch.constants.JobStatusCode.*;
import static com.zkj.loan.common.internet.constant.BusinessConstant.SUCCESS_00000;
import static com.zkj.loan.common.internet.service.contract.entity.ContractConst.BIZ_TYPE_FILE_DOWNLOAD;
/**
* 功能描述: <br>
@ -65,8 +54,7 @@ public class MsxfContractDownloadTasklet extends MsxfContractBatchTasklet {
private MsxfSftpClient msxfSftpClient;
@Resource
private SysMqRecordMapper sysMqRecordMapper;
@Resource
private IdGenerator idGenerator;
private final static String MSG = "批量下载合同文件【msxfContractDownloadTasklet】";
private static final Semaphore SEMAPHORE = new Semaphore(10);
private static final List<String> RETRY_LIST = new ArrayList<>();
@ -128,19 +116,13 @@ public class MsxfContractDownloadTasklet extends MsxfContractBatchTasklet {
private void download(JSONObject jsonParams, List<String> fileNames, Boolean first) {
// 创建一个固定大小的线程池
int size = CollUtil.size(fileNames);
//ExecutorService executor = Executors.newFixedThreadPool(size);
List<SysMqRecord> recordList = new ArrayList<>();
String bizDate = jsonParams.getStr("bizDate");
QueryWrapper<SysMqRecord> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(SysMqRecord::getBizDate,bizDate);
queryWrapper.lambda().eq(SysMqRecord::getBizType,ContractConst.BIZ_TYPE_FILE_DOWNLOAD);
List<SysMqRecord> list = sysMqRecordMapper.selectList(queryWrapper);
Map<String, SysMqRecord> map = list.stream().collect(Collectors.toMap
(SysMqRecord::getBizNo, SysMqRecord -> SysMqRecord, (a1, a2) -> a1));
ExecutorService executor = Executors.newFixedThreadPool(size);
// 最多10个任务执行
for (int i = 0; i < size; i++) {
String filename = CollUtil.get(fileNames, i);
executor.submit(() -> {
try {
SEMAPHORE.acquire();
log.info("开始下载文件 {} ...", filename);
jsonParams.set("filename", filename);
@ -161,27 +143,6 @@ public class MsxfContractDownloadTasklet extends MsxfContractBatchTasklet {
ZipUtils.unzip(zipLocalPath, unzipFilePath);
log.info("文件 {} 解压完毕...", filename);
// 创建 File 对象
File directory = new File(unzipFilePath);
String bizNo = StrUtil.removeSuffix(filename, ".zip");
// 检查路径是否存在并且是一个目录
if (directory.exists() && directory.isDirectory()) {
// 获取目录下的文件列表
File[] files = directory.listFiles();
// 遍历文件列表
if (files != null) {
for (File fil : files) {
SysMqRecord mqRecord = map.get(bizNo);
if (Objects.nonNull(mqRecord)){
continue;
}
addrecordList(recordList,fil,bizNo,bizDate);
}
}
} else {
System.out.println("指定的路径不是一个有效的目录。");
}
} catch (Exception e) {
// 判断是否为首次下载如果不是则不再尝试
if (first) {
@ -193,115 +154,10 @@ public class MsxfContractDownloadTasklet extends MsxfContractBatchTasklet {
} finally {
SEMAPHORE.release();
}
}
if (!CollectionUtils.isEmpty(recordList)) {
sysMqRecordMapper.insertBatch(recordList);
}
}
private void addrecordList(List<SysMqRecord> recordList,File fil,String bizNo,String bizDate) {
if (fil.getName().contains(ContractConst.CONTRACT_POLICY)){
SysMqRecord mqRecordDown = new SysMqRecord();
mqRecordDown.setId(idGenerator.nextIdStr());
mqRecordDown.setBizType(ContractConst.BIZ_TYPE_FILE_DOWNLOAD);
mqRecordDown.setBizFileType(ContractConst.CONTRACT_POLICY);
mqRecordDown.setBizNo(bizNo);
JSONObject jsonObject = new JSONObject();
jsonObject.put("appNo",bizNo);
jsonObject.put("filePath",fil.getAbsolutePath());
mqRecordDown.setData(jsonObject.toString());
mqRecordDown.setStatus(SysMqRecord.Status.DONE.getStatus());
mqRecordDown.setBizDate(bizDate);
recordList.add(mqRecordDown);
SysMqRecord mqRecordSign = new SysMqRecord();
BeanUtil.copyProperties(mqRecordDown,mqRecordSign);
mqRecordSign.setId(idGenerator.nextIdStr());
mqRecordSign.setBizType(ContractConst.BIZ_TYPE_FILE_SIGN);
mqRecordSign.setStatus(SysMqRecord.Status.DOING.getStatus());
recordList.add(mqRecordSign);
SysMqRecord mqRecordBack = new SysMqRecord();
BeanUtil.copyProperties(mqRecordDown,mqRecordBack);
mqRecordBack.setId(idGenerator.nextIdStr());
mqRecordBack.setBizType(ContractConst.BIZ_TYPE_FILE_BACK);
mqRecordBack.setStatus(SysMqRecord.Status.DOING.getStatus());
recordList.add(mqRecordBack);
} else if (fil.getName().contains("entrust")){
SysMqRecord mqRecordDown = new SysMqRecord();
mqRecordDown.setId(idGenerator.nextIdStr());
mqRecordDown.setBizType(ContractConst.BIZ_TYPE_FILE_DOWNLOAD);
mqRecordDown.setBizFileType(ContractConst.CONTRACT_PROXY);
mqRecordDown.setBizNo(bizNo);
JSONObject jsonObject = new JSONObject();
jsonObject.put("appNo",bizNo);
jsonObject.put("filePath",fil.getAbsolutePath());
mqRecordDown.setData(jsonObject.toString());
mqRecordDown.setStatus(SysMqRecord.Status.DONE.getStatus());
mqRecordDown.setBizDate(bizDate);
recordList.add(mqRecordDown);
SysMqRecord mqRecordSign = new SysMqRecord();
BeanUtil.copyProperties(mqRecordDown,mqRecordSign);
mqRecordSign.setId(idGenerator.nextIdStr());
mqRecordSign.setBizType(ContractConst.BIZ_TYPE_FILE_SIGN);
mqRecordSign.setStatus(SysMqRecord.Status.DOING.getStatus());
recordList.add(mqRecordSign);
SysMqRecord mqRecordBack = new SysMqRecord();
BeanUtil.copyProperties(mqRecordDown,mqRecordBack);
mqRecordBack.setId(idGenerator.nextIdStr());
mqRecordBack.setBizType(ContractConst.BIZ_TYPE_FILE_BACK);
mqRecordBack.setStatus(SysMqRecord.Status.DOING.getStatus());
recordList.add(mqRecordBack);
} else if (fil.getName().contains(ContractConst.CONTRACT_FINANCING)) {
SysMqRecord mqRecordDown = new SysMqRecord();
mqRecordDown.setId(idGenerator.nextIdStr());
mqRecordDown.setBizType(ContractConst.BIZ_TYPE_FILE_DOWNLOAD);
mqRecordDown.setBizFileType(ContractConst.CONTRACT_FINANCING);
mqRecordDown.setBizNo(bizNo);
JSONObject jsonObject = new JSONObject();
jsonObject.put("appNo",bizNo);
jsonObject.put("filePath",fil.getAbsolutePath());
mqRecordDown.setData(jsonObject.toString());
mqRecordDown.setStatus(SysMqRecord.Status.DONE.getStatus());
mqRecordDown.setBizDate(bizDate);
recordList.add(mqRecordDown);
SysMqRecord mqRecordSign = new SysMqRecord();
BeanUtil.copyProperties(mqRecordDown,mqRecordSign);
mqRecordSign.setId(idGenerator.nextIdStr());
mqRecordSign.setBizType(ContractConst.BIZ_TYPE_FILE_SIGN);
mqRecordSign.setStatus(SysMqRecord.Status.DOING.getStatus());
recordList.add(mqRecordSign);
SysMqRecord mqRecordBack = new SysMqRecord();
BeanUtil.copyProperties(mqRecordDown,mqRecordBack);
mqRecordBack.setId(idGenerator.nextIdStr());
mqRecordBack.setBizType(ContractConst.BIZ_TYPE_FILE_BACK);
mqRecordBack.setStatus(SysMqRecord.Status.DOING.getStatus());
recordList.add(mqRecordBack);
} else if (fil.getName().contains(ContractConst.INSTALLMENT_GUARANTEE)) {
SysMqRecord mqRecordDown = new SysMqRecord();
mqRecordDown.setId(idGenerator.nextIdStr());
mqRecordDown.setBizType(ContractConst.BIZ_TYPE_FILE_DOWNLOAD);
mqRecordDown.setBizFileType(ContractConst.INSTALLMENT_GUARANTEE);
mqRecordDown.setBizNo(bizNo);
JSONObject jsonObject = new JSONObject();
jsonObject.put("appNo",bizNo);
jsonObject.put("filePath",fil.getAbsolutePath());
mqRecordDown.setData(jsonObject.toString());
mqRecordDown.setStatus(SysMqRecord.Status.DONE.getStatus());
mqRecordDown.setBizDate(bizDate);
recordList.add(mqRecordDown);
SysMqRecord mqRecordSign = new SysMqRecord();
BeanUtil.copyProperties(mqRecordDown,mqRecordSign);
mqRecordSign.setId(idGenerator.nextIdStr());
mqRecordSign.setBizType(ContractConst.BIZ_TYPE_FILE_SIGN);
mqRecordSign.setStatus(SysMqRecord.Status.DOING.getStatus());
recordList.add(mqRecordSign);
SysMqRecord mqRecordBack = new SysMqRecord();
BeanUtil.copyProperties(mqRecordDown,mqRecordBack);
mqRecordBack.setId(idGenerator.nextIdStr());
mqRecordBack.setBizType(ContractConst.BIZ_TYPE_FILE_BACK);
mqRecordBack.setStatus(SysMqRecord.Status.DOING.getStatus());
recordList.add(mqRecordBack);
});
}
// 关闭线程池
executor.shutdown();
}
private JSONObject populateParams(JobReqEntity jobReqEntity) {
@ -329,7 +185,6 @@ public class MsxfContractDownloadTasklet extends MsxfContractBatchTasklet {
jsonParams.set("saveFilePath", saveFilePath);
jsonParams.set("downloadPath", downloadPath);
jsonParams.set("uuid", uuid);
jsonParams.set("bizDate",formattedDate);
String bizType = getEventType(jobReqEntity);
Integer status = getStatus(jobReqEntity);

View File

@ -1,43 +1,28 @@
package com.zkj.loan.batch.tasklet.msxf;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zkj.loan.batch.tasklet.MsxfContractBatchTasklet;
import com.zkj.loan.common.internet.feign.MsxfSftpClient;
import com.zkj.loan.common.internet.feign.pojo.MsxfSftpReqVO;
import com.zkj.loan.common.internet.feign.pojo.MsxfSftpRespVO;
import com.zkj.loan.common.internet.mapper.sys.SysMqRecordMapper;
import com.zkj.loan.common.internet.model.sys.SysMqRecord;
import com.zkj.loan.common.internet.service.contract.entity.ContractConst;
import com.zkj.loan.common.internet.service.sub.msxf.domain.pojo.LmtSignRecordVO;
import com.zkj.loan.common.internet.service.tranfer.FileTransferService;
import com.zkj.loan.common.internet.utils.BatchFileUtil;
import com.zkj.loan.common.internet.utils.DateUtil;
import com.zkj.open.api.client.feign.api.Result;
import com.zkj.rcs.common.core.util.ftp.SFTPUtil;
import com.zkj.rcs.scheduler.model.JobReqEntity;
import com.zkj.rcs.scheduler.model.JobRespEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.time.LocalDate;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;
import static com.zkj.loan.batch.constants.JobStatusCode.*;
import static com.zkj.loan.common.internet.constant.BusinessConstant.SUCCESS_00000;
import static com.zkj.loan.common.internet.service.sub.msxf.domain.enums.EventType.FILE_BACK;
/**
@ -61,98 +46,41 @@ public class MsxfContractToSFTPTasklet extends MsxfContractBatchTasklet {
@Resource
private FileTransferService fileTransferService;
@Resource
private MsxfSftpClient msxfSftpClient;
@Value("${msxf.file.transfer.sleep.enabled:true}")
private boolean sleepEnabled;
private final static String MSG = "回传签章合同给马上消费【msxfContractToSFTPTasklet】";
@Override
public void runJob(JobReqEntity jobReqEntity, JobRespEntity jobRespEntity) throws Exception {
log.info("批量【msxfContractToSFTPTasklet】入参[{}]", jobReqEntity);
String date = getDate(jobReqEntity);
String bizDate = StringUtils.isEmpty(date) ? LocalDate.now().toString() : date;
String formatDate = getYesDateFormats(bizDate);
String coopNo = getCoopNo(jobReqEntity);
String prdCode = getPrdCode(jobReqEntity);
String fileType = getFileType(jobReqEntity);
//事件类型 参考EventType.java 枚举
String eventType = getEventType(jobReqEntity);
//状态枚举 参考SysMqRecord.java ,Status枚举
Integer status = getStatus(jobReqEntity);
String eventType = getEventType(jobReqEntity);
// 使用逗号分割字符串
String[] array = eventType.split(",");
// 将数组转换为 List
List<String> list = Arrays.asList(array);
QueryWrapper<SysMqRecord> queryBack = new QueryWrapper<>();
queryBack.lambda().eq(SysMqRecord::getBizDate,formatDate)
.in(SysMqRecord::getBizFileType, list)
.in(SysMqRecord::getBizType, ContractConst.BIZ_TYPE_FILE_BACK)
.ne(SysMqRecord::getStatus, "2");
List<SysMqRecord> backFail = sysMqRecordMapper.selectList(queryBack);
QueryWrapper<SysMqRecord> querySign = new QueryWrapper<>();
querySign.lambda().eq(SysMqRecord::getBizDate,formatDate)
.in(SysMqRecord::getBizFileType, list)
.in(SysMqRecord::getBizType, ContractConst.BIZ_TYPE_FILE_SIGN)
.eq(SysMqRecord::getStatus, "2");
List<SysMqRecord> signSucc = sysMqRecordMapper.selectList(querySign);
// 使用循环将 List 转换为 Map
Map<String, SysMqRecord> signMap = new HashMap<>();
for (SysMqRecord obj : signSucc) {
String key = obj.getBizFileType() + "-" + obj.getBizNo(); // 拼接 key
signMap.put(key, obj);
}
List<SysMqRecord> recordsUpdated = uploadFiles(backFail,signMap, jobReqEntity);
Map<String, List<SysMqRecord>> uploadedGroup = CollStreamUtil.groupByKey(recordsUpdated, SysMqRecord::getBizDate);
// 上传马上sftp服务路径/upload/DXBANK/back/contract/YYYYMMDD/
/* String backSftpPath = getUploadPath(jobReqEntity, date);
String backSftpPath = getUploadPath(jobReqEntity, date);
String signFilePath = getSignFilePath(jobReqEntity, getYesDateFormats(date));
List<String> eventTypeList = StrUtil.split(eventType, StrUtil.COMMA);
List<SysMqRecord> recordsToUpload = queryRecordsToUpload(date, status, eventTypeList);
String okDownloadFilename = "DXBANK_download.ok";
*/
try {
SFTPUtil sftpUtil = fileTransferService.getSftpUtilInstance(coopNo, prdCode, fileType);
sftpUtil.login();
List<SysMqRecord> recordsToUpdate = uploadFiles(recordsToUpload, backSftpPath, signFilePath, sftpUtil);
updateSysMqRecordStatus(recordsToUpdate);
String okfileContent = "0|" + recordsToUpdate.size();
BatchFileUtil.makeFile(signFilePath, okDownloadFilename, okfileContent.getBytes());
sftpUtil.upload(backSftpPath, signFilePath + okDownloadFilename);
jobRespEntity.setRespCode(RESP_CODE_000000);
jobRespEntity.setRespMesg(RESP_MESG_000000);
}
private List<SysMqRecord> uploadFiles(List<SysMqRecord> recordsToUpload,Map<String, SysMqRecord> signMap, JobReqEntity jobReqEntity) {
for (SysMqRecord record : recordsToUpload) {
try {
String key = record.getBizFileType() + "-" + record.getBizNo();
SysMqRecord mqRecord = signMap.get(key);
if (mqRecord == null){
continue;
}
// 上传马上sftp服务路径/upload/DXBANK/back/contract/YYYYMMDD/
String backSftpPath = getUploadPath(jobReqEntity, record.getBizDate());
// 获取远端服务器保存文件路径
String data = mqRecord.getData();
String signedPath = JSONObject.parseObject(data).getString("signedPath");
if (StringUtils.isEmpty(signedPath)){
continue;
}
//String saveFilePath = getSaveFilePath(jobReqEntity, record.getBizDate());
boolean success = uploadFile(record, backSftpPath, signedPath);
record.setStatus(success ? SysMqRecord.Status.DONE.getStatus() : SysMqRecord.Status.FAILED.getStatus());
} catch (Exception e) {
log.error("{} 上传合同失败serNo{}", MSG, record.getBizNo(), e);
record.setStatus(SysMqRecord.Status.FAILED.getStatus());
} finally {
try {
// 进行记录更新
updateSysMqRecordStatus(record);
} catch (Exception ex) {
log.error("{} 记录更新异常", record.getBizNo());
log.error("msxfContractToSFTPTasklet 批量上传合同到马上消费SFTP失败", e);
jobRespEntity.setRespCode(RESP_CODE_000056);
jobRespEntity.setRespMesg(RESP_MESG_000056);
}
}
}
return CollUtil.removeNull(recordsToUpload);
}
private List<SysMqRecord> queryRecordsToUpload(String date, Integer status, List<String> eventTypeList) {
String bizDate = DateUtil.addDate(date, -1);
@ -160,57 +88,47 @@ public class MsxfContractToSFTPTasklet extends MsxfContractBatchTasklet {
return sysMqRecordMapper.selectList(queryWrapper);
}
private boolean uploadFile(SysMqRecord sysMqRecord, String backSftpPath, String saveFilePath) throws Exception {
if(sleepEnabled){
log.info("******** 开启睡眠 。。。 2秒 ********");
Thread.sleep(2000);
private List<SysMqRecord> uploadFiles(List<SysMqRecord> recordsToUpload, String backSftpPath, String signFilePath, SFTPUtil sftpUtil) {
return recordsToUpload.stream()
.map(record -> {
try {
boolean success = uploadFile(record, backSftpPath, signFilePath, sftpUtil);
record.setBizType(FILE_BACK.name());
record.setStatus(success ? SysMqRecord.Status.DOING.getStatus() : SysMqRecord.Status.FAILED.getStatus());
return record;
} catch (Exception e) {
log.error("上传合同失败serNo{}", record.getBizNo(), e);
record.setStatus(SysMqRecord.Status.FAILED.getStatus());
return record;
}
})
.collect(Collectors.toList());
}
private boolean uploadFile(SysMqRecord sysMqRecord, String backSftpPath, String signFilePath, SFTPUtil sftpUtil) throws Exception {
String serNo = sysMqRecord.getBizNo();
if (StrUtil.isBlank(serNo)) {
log.error("serNo 不存在 id:{}", sysMqRecord.getId());
return false;
}
if (StrUtil.isBlank(sysMqRecord.getData())) {
throw new RuntimeException("文件元信息不存在");
LmtSignRecordVO lmtSignRecordVO = JSONUtil.toBean(sysMqRecord.getData(), LmtSignRecordVO.class);
if (lmtSignRecordVO == null) {
signFilePath = signFilePath + serNo + "/" + "_contract.pdf";
lmtSignRecordVO = new LmtSignRecordVO(serNo, "", signFilePath, "", "", backSftpPath);
} else {
signFilePath = lmtSignRecordVO.getSignPath();
}
/*LmtSignRecordVO lmtSignRecordVO = JSONUtil.toBean(sysMqRecord.getData(), LmtSignRecordVO.class);
String signFilePath = lmtSignRecordVO.getSignPath();*/
if (StrUtil.isBlank(saveFilePath)) {
throw new RuntimeException("签章合同文件路径不存在");
}
File file = FileUtil.file(saveFilePath);
File file = FileUtil.file(signFilePath);
if (!FileUtil.exist(file)) {
log.error("签章的电子合同不存在serNo{}signFilePath{}", sysMqRecord.getBizNo(), saveFilePath);
log.error("签章的电子合同不存在serNo{}signFilePath{}", sysMqRecord.getBizNo(), signFilePath);
lmtSignRecordVO.setSignMsg("签章的电子合同不存在serNo{}signFilePath{}" + sysMqRecord.getBizNo() + signFilePath);
return false;
}
// 调用接口进行SFTP上传
MsxfSftpReqVO msxfSftpReqVO = new MsxfSftpReqVO();
msxfSftpReqVO.setUuid(IdUtil.fastSimpleUUID());
msxfSftpReqVO.setSaveFilePath(saveFilePath);
msxfSftpReqVO.setFileName(FileUtil.getName(file));
msxfSftpReqVO.setSftpUploadPath(backSftpPath);
msxfSftpReqVO.setFileContent(FileUtil.readBytes(file));
Result result = msxfSftpClient.contBacksend(JSONUtil.parseObj(msxfSftpReqVO));
log.info("{} 调用接口进行SFTP回传结果:{}", MSG, result);
if (!SUCCESS_00000.equals(result.getCode())) {
throw new RuntimeException("调用接口进行SFTP回传失败");
}
MsxfSftpRespVO msxfSftpRespVO = BeanUtil.toBean(result.getData(), MsxfSftpRespVO.class);
if (ObjectUtil.isNotNull(msxfSftpRespVO)) {
String returnCode = msxfSftpRespVO.getReturnCode();
if (StrUtil.isNotEmpty(returnCode) && "000000".equals(returnCode)) {
sysMqRecord.setData(JSONUtil.toJsonStr(msxfSftpRespVO));
sftpUtil.upload(backSftpPath, signFilePath);
sysMqRecord.setData(JSONUtil.toJsonStr(lmtSignRecordVO));
return true;
}
}
return false;
}
}

View File

@ -3,8 +3,6 @@ package com.zkj.loan.batch.tasklet.msxfold;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zkj.loan.batch.tasklet.BaseBatchTasklet;
import com.zkj.loan.common.internet.mapper.bat.FacLoanDuebillMapper;
import com.zkj.loan.common.internet.model.bat.FacLoanDuebill;
import com.zkj.loan.common.internet.model.biz.CtrlLoanDetail;
import com.zkj.loan.common.internet.service.base.biz.CtrlLoanDetailService;
import com.zkj.loan.common.internet.service.base.fac.LoanDetailsService;
@ -64,9 +62,6 @@ public class MsxfLoanDetailFileTasklet extends BaseBatchTasklet {
@Resource
private RedissonClient redissonClient;
@Resource
private FacLoanDuebillMapper facLoanDuebillMapper;
private static final String[] CALC_FIELD = {
"biz_date",
"contNo",
@ -94,7 +89,7 @@ public class MsxfLoanDetailFileTasklet extends BaseBatchTasklet {
String prdCode = (String) jobReqEntity.getJobParameter().get("prdCode");//文件名称
if (Objects.nonNull(object)) {
String tranDate = (String) object;
date = LocalDate.parse(tranDate);
date = LocalDate.parse(tranDate).plusDays(-1);
} else {
RBucket<LocalDate> redisPreDate = redissonClient.getBucket(SysRedisConstant.PREDATE);
date = redisPreDate.get();
@ -107,22 +102,12 @@ public class MsxfLoanDetailFileTasklet extends BaseBatchTasklet {
queryWrapper.lambda().eq(CtrlLoanDetail::getPrdCode,prdCode);
ctrlLoanDetailService.remove(queryWrapper);
/*QueryWrapper<FacLoanDuebill> loanDuebillQuery = new QueryWrapper<>();
loanDuebillQuery.lambda().eq(FacLoanDuebill::getBizDate,yesDate);
loanDuebillQuery.lambda().eq(FacLoanDuebill::getCoopNo,chanCode);
loanDuebillQuery.lambda().eq(FacLoanDuebill::getPrdCode,prdCode);
loanDuebillQuery.select("ifnull(sum(loan_bal),0) as loanBal,ifnull(sum(over_bal),0) as overBal");
FacLoanDuebill loanDuebill = facLoanDuebillMapper.selectOne(loanDuebillQuery);
*/
CtrlLoanDetail loanDetail = loanDetailsService.countLoanData(yesDate,chanCode,prdCode);
loanDetail.setId(idGenerator.nextIdStr());
loanDetail.setOverLoanAmt(loanDetail.getOverAmt());
loanDetail.setCoopNo(chanCode);
loanDetail.setPrdCode(prdCode);
loanDetail.setCreateDate(LocalDate.now());
loanDetail.setCreateTime(LocalDateTime.now());
loanDetail.setUpdateDate(LocalDate.now());
loanDetail.setUpdateTime(LocalDateTime.now());
ctrlLoanDetailService.save(loanDetail);
/* String ctrlFile = saveTmpPath + "/" + yesDate + "-filelist"+ "/" + getFileName() + ".ctrl";
String ctrlFilePattern = replaceDatePattern(ctrlFile,yesDate);

View File

@ -2,19 +2,15 @@ package com.zkj.loan.batch.tasklet.msxfold;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.Query;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zkj.loan.batch.tasklet.BaseBatchTasklet;
import com.zkj.loan.common.internet.mapper.biz.BizLoanClaimRepayMapper;
import com.zkj.loan.common.internet.mapper.cus.PlsRepayPlanDetailMapper;
import com.zkj.loan.common.internet.mapper.pls.ext.RepayPlanDetailExtMapper;
import com.zkj.loan.common.internet.model.biz.BizLoanClaimRepay;
import com.zkj.loan.common.internet.model.biz.CtrlRepayDetail;
import com.zkj.loan.common.internet.model.cus.CusCoopMapping;
import com.zkj.loan.common.internet.model.fac.LoanRepayPlan;
import com.zkj.loan.common.internet.model.lmt.LmtCusCrdtLmt;
import com.zkj.loan.common.internet.model.pls.RepayPlanDetail;
import com.zkj.loan.common.internet.service.base.biz.BizLoanClaimRepayService;
import com.zkj.loan.common.internet.service.base.biz.CtrlRepayDetailService;
import com.zkj.loan.common.internet.service.base.cus.CusCoopMappingService;
import com.zkj.loan.common.internet.service.base.lmt.LmtCusCrdtLmtService;
@ -68,8 +64,7 @@ public class MsxfRepayFileTasklet extends BaseBatchTasklet {
@Resource
private IdGenerator idGenerator;
@Resource
private BizLoanClaimRepayMapper bizLoanClaimRepayMapper;
@Resource
private CtrlRepayDetailService ctrlRepayDetailService;
@ -120,18 +115,12 @@ public class MsxfRepayFileTasklet extends BaseBatchTasklet {
}
String dateStr = date.toString().replace("-", "");
BizLoanClaimRepay claimRepay = bizLoanClaimRepayMapper.countClaimData(dateStr,chanCode,prdCode);
CtrlRepayDetail repayDetail = plsRepayPlanDetailMapper.countRepayData(dateStr,chanCode,prdCode);
repayDetail.setId(idGenerator.nextIdStr());
repayDetail.setClaimPrinAmt(claimRepay.getRepayAmt());
repayDetail.setClaimIntAmt(claimRepay.getPaidIntAmt());
repayDetail.setClaimPnltAmt(claimRepay.getPaidPnltAmt());
repayDetail.setPrdCode(prdCode);
repayDetail.setChanCode(chanCode);
repayDetail.setCreateDate(LocalDate.now());
repayDetail.setCreateData(LocalDate.now());
repayDetail.setCreateTime(LocalDateTime.now());
repayDetail.setUpdateDate(LocalDate.now());
repayDetail.setUpdateTime(LocalDateTime.now());
QueryWrapper<CtrlRepayDetail> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(CtrlRepayDetail::getBizDate,dateStr);

View File

@ -30,7 +30,7 @@ import java.util.stream.Collectors;
import static com.zkj.loan.batch.constants.JobStatusCode.*;
/**
* @Description: 签章跑批任务
* @Description: 什邡村行客户信息到信贷文件
* @Author: ziming.ni
* @Date: 2024/11/29
*/
@ -77,7 +77,7 @@ public class Fdd01ContractTasklet extends AbstractBatchTasklet {
JSONObject jsonObject = JSONObject.parseObject(e.getData());
String filePath = jsonObject.getString("filePath");
// 需要删除
// filePath = filePath.replace("/home/nas/contract/20250304/23021313383194dnriajv7enSHNSBANK/", "E:\\IdeaProjects\\cc\\rcs-sys\\loan-parent\\aTree\\contract\\");
filePath = filePath.replace("/home/nas/contract/20250304/23021313383194dnriajv7enSHNSBANK/", "E:\\IdeaProjects\\cc\\rcs-sys\\loan-parent\\aTree\\contract\\");
FileEntity fileEntity = new FileEntity();
fileEntity.setFilePath(filePath);
fileEntity.setContractId(e.getId());
@ -123,9 +123,10 @@ public class Fdd01ContractTasklet extends AbstractBatchTasklet {
String singedUrl = signFdd.getString("download_url");
jsonObject.put("signedUrl", singedUrl);
// String path = "E:\\IdeaProjects\\cc\\rcs-sys\\loan-parent\\aTree\\signContract";
downloadUrl(bizDate, signedPath, singedUrl, e);
jsonObject.put("signedPath", StrUtil.join(File.separator, signedPath, bizDate, e.getBizNo(), e.getBizNo() + "_" + e.getBizFileType() + ".pdf"));
String path = "E:\\IdeaProjects\\cc\\rcs-sys\\loan-parent\\aTree\\signContract";
downloadUrl(bizDate, path, singedUrl, e);
jsonObject.put("signedPath", StrUtil.join(File.separator, "/home/nas/signContract", bizDate, e.getBizNo(), e.getBizNo() + "_" + e.getBizFileType() + ".pdf"));
// downloadUrl(bizDate, signedPath, singedUrl);
e.setData(JSON.toJSONString(jsonObject));
e.setBizType(ContractConst.FILE_SIGNED);

View File

@ -55,8 +55,7 @@ public class JobRequest {
@ApiModelProperty("本地保存ok文件名包含路径")
private String uploadOkFileFullName;
@ApiModelProperty("本地保存路径")
// private String signedPath = "E:\\IdeaProjects\\cchx\\rcs-sys\\loan-parent\\aTest";
private String signedPath = "/home/nas/signContract";
private String signedPath = "E:\\IdeaProjects\\cchx\\rcs-sys\\loan-parent\\aTest";
@ApiModelProperty("本地保存文件名包含路径-临时文件路径")
private String saveFileFullName;
@ApiModelProperty("产品编码")

View File

@ -34,7 +34,4 @@ public interface BizLoanClaimRepayMapper extends BaseMapper<BizLoanClaimRepay> {
@Param("coopNo") String coopNo);
List<BizRecoveryBlackList> selectClaimCustList(@Param("createDate") LocalDate createDate,@Param("isUpdate") Boolean isUpdate);
BizLoanClaimRepay countClaimData(@Param("bizDate")String dateStr,@Param("coopNo") String chanCode, @Param("prdCode")String prdCode);
}

View File

@ -143,14 +143,4 @@
</where>
</select>
<select id="countClaimData" resultType="com.zkj.loan.common.internet.model.biz.BizLoanClaimRepay">
SELECT ifnull(sum(blcr.repay_amt),0) as repay_amt , ifnull(sum(blcr.paid_int_amt),0) as paid_int_amt,
ifnull(sum(blcr.paid_pnlt_amt),0) as paid_pnlt_amt
FROM biz_loan_claim_repay blcr
left join fac_loan_duebill fld on blcr.duebill_no = fld.duebill_no
where blcr.biz_date = #{bizDate} and blcr.coop_no = #{coopNo} and fld.prd_code = #{prdCode}
</select>
</mapper>

View File

@ -282,8 +282,7 @@
<select id="countLoanData" resultType="com.zkj.loan.common.internet.model.biz.CtrlLoanDetail">
SELECT
fls.biz_date as bizDate, count(fls.id) as detailTotal, sum(fls.loan_amt) as loanAmtTotal,
ifnull(sum(fld.loan_bal),0) as loanBal,ifnull(sum(fld.over_bal),0) as overAmt
fls.biz_date as bizDate, count(fls.id) as detailTotal, sum(fls.loan_amt) as loanAmtTotal
FROM fac_loan_details fls
left join fac_loan_duebill fld on fls.duebill_no = fld.duebill_no
where fls.biz_date = #{yesDate,jdbcType=VARCHAR} and fls.coop_no = #{chanCode,jdbcType=VARCHAR}

View File

@ -54,8 +54,7 @@
create_time,
update_time,
cust_no,
duebill_no,
biz_file_type
duebill_no
)
VALUES
<foreach collection="list" item="record" separator=",">
@ -65,12 +64,11 @@
#{record.bizNo},
#{record.data},
#{record.status},
#{record.bizDate},
DATE_FORMAT(NOW(), '%Y%m%d'),
NOW(),
NOW(),
#{record.custNo},
#{record.duebillNo},
#{record.bizFileType}
#{record.duebillNo}
)
</foreach>
</insert>

View File

@ -40,10 +40,4 @@ public class CtrlLoanDetail extends CommonEntity {
private String coopNo;
private String prdCode;
private BigDecimal loanBal;
private BigDecimal overAmt;
private BigDecimal overLoanAmt;
}

View File

@ -59,23 +59,6 @@ public class CtrlRepayDetail {
*/
private BigDecimal repayPnltAmt;
/**
* 理赔本金
*/
private BigDecimal claimPrinAmt;
/**
* 理赔利息
*/
private BigDecimal claimIntAmt;
/**
* 理赔罚息
*/
private BigDecimal claimPnltAmt;
/**
* 产品编号
*/
@ -86,11 +69,11 @@ public class CtrlRepayDetail {
*/
private String chanCode;
private LocalDate createDate;
private LocalDate createData;
private LocalDateTime createTime;
private LocalDate updateDate;
private LocalDate updateData;
private LocalDateTime updateTime;

View File

@ -28,6 +28,11 @@ public class SysMqRecord extends IdEntity {
*/
private String bizType;
/**
* 文件类型
*/
private String bizFileType;
/**
* 交易流水号
*/
@ -68,10 +73,6 @@ public class SysMqRecord extends IdEntity {
*/
private Date updateTime;
/**
* 文件类型
*/
private String bizFileType;
/**
* 状态枚举
*/

View File

@ -58,10 +58,4 @@ public interface MsxfSftpClient {
*/
@PostMapping("/msxf/api/sftp/files/download")
ResponseEntity<byte[]> downloadFileContent(@RequestBody JSONObject params) throws Exception;
/**
* 马上电子合同文件sftp回传
*/
@PostMapping("/msxf/cont/backsend")
Result contBacksend(@RequestBody JSONObject params) throws Exception;
}

View File

@ -7,8 +7,6 @@ import com.zkj.open.api.client.feign.api.Result;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @Classname OpenApiFeignFallback
@ -52,13 +50,6 @@ public class MsxfSftpFeignFallback implements MsxfSftpClient {
return result;
}
@Override
public Result contBacksend(JSONObject params) throws Exception {
Result result = new Result();
result.setCode(FeignConstant.FAIL_999999);
result.setMessage(FeignConstant.HYSTRIX_FAIL_MSG);
return result;
}
@Override
public Result loanImages(JSONObject params) {
Result result = new Result();

View File

@ -1,44 +0,0 @@
package com.zkj.loan.common.internet.feign.pojo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 马消SFTP请求对象
*
* @author xinrui.xiao
* @date 2023-04-18 11:20
* @since 1.0.0
*/
@Data
@Accessors(chain = true)
public class MsxfSftpReqVO implements Serializable {
/**
* uuid
*/
private String uuid;
/**
* SFTP回传路径
*/
private String sftpUploadPath;
/**
* 保存文件路径
*/
private String saveFilePath;
/**
* 文件名称
*/
private String fileName;
/**
* 文件内容
*/
private byte[] fileContent;
}

View File

@ -38,6 +38,4 @@ public interface ContractConst {
String FDD_FILE_UPLOAD_CODE_SUCC = "1000";
// 3.FDD-文件上传成功
String FDD_FILE_UPLOAD_CODE_FAILD = "2002";
// 4.业务类型-文件下载
String BIZ_TYPE_FILE_DOWNLOAD = "FILE_DOWNLOAD";
}