From b801a90a2e80864224d24bcadf4fb282eb5925c4 Mon Sep 17 00:00:00 2001 From: 15737803739 Date: Tue, 11 Mar 2025 14:41:26 +0800 Subject: [PATCH] =?UTF-8?q?2025-03-11=20=20=E4=BB=A3=E7=A2=BC=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasklet/MsxfContractBatchTasklet.java | 11 + .../msxf/MsxfContractDownloadTasklet.java | 219 +++++++++++++++--- .../msxf/MsxfContractToSFTPTasklet.java | 182 +++++++++++---- .../msxfold/MsxfLoanDetailFileTasklet.java | 17 +- .../tasklet/msxfold/MsxfRepayFileTasklet.java | 15 +- .../mapper/biz/BizLoanClaimRepayMapper.java | 5 +- .../mapper/biz/BizLoanClaimRepayMapper.xml | 52 +++-- .../mapper/fac/LoanDetailsMapper.xml | 41 ++-- .../mapper/sys/SysMqRecordMapper.xml | 76 +++--- .../internet/model/biz/CtrlLoanDetail.java | 6 + .../internet/model/biz/CtrlRepayDetail.java | 21 +- .../internet/model/sys/SysMqRecord.java | 9 +- .../common/internet/feign/MsxfSftpClient.java | 6 + .../feign/fallback/MsxfSftpFeignFallback.java | 11 +- .../internet/feign/pojo/MsxfSftpReqVO.java | 44 ++++ .../contract/entity/ContractConst.java | 2 + 16 files changed, 540 insertions(+), 177 deletions(-) create mode 100644 loan-parent/loan-common-internet/loan-common-internet-service/src/main/java/com/zkj/loan/common/internet/feign/pojo/MsxfSftpReqVO.java diff --git a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/MsxfContractBatchTasklet.java b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/MsxfContractBatchTasklet.java index 2e5abac..d8af482 100644 --- a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/MsxfContractBatchTasklet.java +++ b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/MsxfContractBatchTasklet.java @@ -3,6 +3,7 @@ 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; @@ -23,6 +24,8 @@ 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"); @@ -83,6 +86,14 @@ 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"); } diff --git a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxf/MsxfContractDownloadTasklet.java b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxf/MsxfContractDownloadTasklet.java index c0c7668..4d223e8 100644 --- a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxf/MsxfContractDownloadTasklet.java +++ b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxf/MsxfContractDownloadTasklet.java @@ -13,26 +13,37 @@ 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; /** * 功能描述:
@@ -54,7 +65,8 @@ 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 RETRY_LIST = new ArrayList<>(); @@ -116,48 +128,180 @@ public class MsxfContractDownloadTasklet extends MsxfContractBatchTasklet { private void download(JSONObject jsonParams, List fileNames, Boolean first) { // 创建一个固定大小的线程池 int size = CollUtil.size(fileNames); - ExecutorService executor = Executors.newFixedThreadPool(size); + //ExecutorService executor = Executors.newFixedThreadPool(size); + List recordList = new ArrayList<>(); + String bizDate = jsonParams.getStr("bizDate"); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(SysMqRecord::getBizDate,bizDate); + queryWrapper.lambda().eq(SysMqRecord::getBizType,ContractConst.BIZ_TYPE_FILE_DOWNLOAD); + List list = sysMqRecordMapper.selectList(queryWrapper); + Map map = list.stream().collect(Collectors.toMap + (SysMqRecord::getBizNo, SysMqRecord -> SysMqRecord, (a1, a2) -> a1)); // 最多10个任务执行 for (int i = 0; i < size; i++) { String filename = CollUtil.get(fileNames, i); - executor.submit(() -> { - try { - SEMAPHORE.acquire(); - log.info("开始下载文件 {} ...", filename); + try { + log.info("开始下载文件 {} ...", filename); - jsonParams.set("filename", filename); - Result result = msxfSftpClient.contDownload(jsonParams); - if (!SUCCESS_00000.equals(result.getCode())) { - throw new RuntimeException("SFTP下载接口调用失败 code:" + result.getCode()); - } - MsxfSftpRespVO msxfSftpRespVO = BeanUtil.toBean(result.getData(), MsxfSftpRespVO.class); - String saveFilePath = msxfSftpRespVO.getFilePatchName(); - String zipLocalPath = saveFilePath + filename; - File file = FileUtil.writeBytes(msxfSftpRespVO.getFileContent(), zipLocalPath); - if (!file.exists()) { - throw new RuntimeException("SFTP文件下载失败,file is not exists"); - } - log.info("文件 {} 下载完毕...", filename); - // 解压缩文件 - String unzipFilePath = saveFilePath + StrUtil.removeSuffix(filename, ".zip") + File.separator; - ZipUtils.unzip(zipLocalPath, unzipFilePath); - log.info("文件 {} 解压完毕...", filename); - - } catch (Exception e) { - // 判断是否为首次下载,如果不是则不再尝试 - if (first) { - RETRY_LIST.add(filename); - } else { - ERROR_LIST.add(filename); - } - log.error("{} 文件 {} 下载失败 ==> {}", MSG, filename, e.getMessage()); - } finally { - SEMAPHORE.release(); + jsonParams.set("filename", filename); + Result result = msxfSftpClient.contDownload(jsonParams); + if (!SUCCESS_00000.equals(result.getCode())) { + throw new RuntimeException("SFTP下载接口调用失败 code:" + result.getCode()); } - }); + MsxfSftpRespVO msxfSftpRespVO = BeanUtil.toBean(result.getData(), MsxfSftpRespVO.class); + String saveFilePath = msxfSftpRespVO.getFilePatchName(); + String zipLocalPath = saveFilePath + filename; + File file = FileUtil.writeBytes(msxfSftpRespVO.getFileContent(), zipLocalPath); + if (!file.exists()) { + throw new RuntimeException("SFTP文件下载失败,file is not exists"); + } + log.info("文件 {} 下载完毕...", filename); + // 解压缩文件 + String unzipFilePath = saveFilePath + StrUtil.removeSuffix(filename, ".zip") + File.separator; + 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) { + RETRY_LIST.add(filename); + } else { + ERROR_LIST.add(filename); + } + log.error("{} 文件 {} 下载失败 ==> {}", MSG, filename, e.getMessage()); + } finally { + SEMAPHORE.release(); + } + + } + if (!CollectionUtils.isEmpty(recordList)) { + sysMqRecordMapper.insertBatch(recordList); + } + } + + private void addrecordList(List 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) { @@ -185,6 +329,7 @@ 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); diff --git a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxf/MsxfContractToSFTPTasklet.java b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxf/MsxfContractToSFTPTasklet.java index 5da15f0..b49b492 100644 --- a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxf/MsxfContractToSFTPTasklet.java +++ b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxf/MsxfContractToSFTPTasklet.java @@ -1,28 +1,43 @@ 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.util.List; +import java.time.LocalDate; +import java.util.*; 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; /** @@ -46,40 +61,97 @@ 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 coopNo = getCoopNo(jobReqEntity); - String prdCode = getPrdCode(jobReqEntity); - String fileType = getFileType(jobReqEntity); - //事件类型 参考EventType.java 枚举 - String eventType = getEventType(jobReqEntity); + String bizDate = StringUtils.isEmpty(date) ? LocalDate.now().toString() : date; + String formatDate = getYesDateFormats(bizDate); //状态枚举 参考SysMqRecord.java ,Status枚举 Integer status = getStatus(jobReqEntity); + String eventType = getEventType(jobReqEntity); + // 使用逗号分割字符串 + String[] array = eventType.split(","); + // 将数组转换为 List + List list = Arrays.asList(array); + QueryWrapper 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 backFail = sysMqRecordMapper.selectList(queryBack); + + QueryWrapper 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 signSucc = sysMqRecordMapper.selectList(querySign); + // 使用循环将 List 转换为 Map + Map signMap = new HashMap<>(); + for (SysMqRecord obj : signSucc) { + String key = obj.getBizFileType() + "-" + obj.getBizNo(); // 拼接 key + signMap.put(key, obj); + } + + List recordsUpdated = uploadFiles(backFail,signMap, jobReqEntity); + Map> 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 eventTypeList = StrUtil.split(eventType, StrUtil.COMMA); List recordsToUpload = queryRecordsToUpload(date, status, eventTypeList); String okDownloadFilename = "DXBANK_download.ok"; +*/ + jobRespEntity.setRespCode(RESP_CODE_000000); + jobRespEntity.setRespMesg(RESP_MESG_000000); - try { - SFTPUtil sftpUtil = fileTransferService.getSftpUtilInstance(coopNo, prdCode, fileType); - sftpUtil.login(); - List 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); - } catch (Exception e) { - log.error("msxfContractToSFTPTasklet 批量上传合同到马上消费SFTP失败", e); - jobRespEntity.setRespCode(RESP_CODE_000056); - jobRespEntity.setRespMesg(RESP_MESG_000056); + } + + private List uploadFiles(List recordsToUpload,Map 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()); + } + } } + + return CollUtil.removeNull(recordsToUpload); } private List queryRecordsToUpload(String date, Integer status, List eventTypeList) { @@ -88,47 +160,57 @@ public class MsxfContractToSFTPTasklet extends MsxfContractBatchTasklet { return sysMqRecordMapper.selectList(queryWrapper); } - private List uploadFiles(List 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 { + private boolean uploadFile(SysMqRecord sysMqRecord, String backSftpPath, String saveFilePath) throws Exception { + if(sleepEnabled){ + log.info("******** 开启睡眠 。。。 2秒 ********"); + Thread.sleep(2000); + } String serNo = sysMqRecord.getBizNo(); if (StrUtil.isBlank(serNo)) { log.error("serNo 不存在 id:{}", sysMqRecord.getId()); return false; } - 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(); + if (StrUtil.isBlank(sysMqRecord.getData())) { + throw new RuntimeException("文件元信息不存在"); } - File file = FileUtil.file(signFilePath); + /*LmtSignRecordVO lmtSignRecordVO = JSONUtil.toBean(sysMqRecord.getData(), LmtSignRecordVO.class); + String signFilePath = lmtSignRecordVO.getSignPath();*/ + if (StrUtil.isBlank(saveFilePath)) { + throw new RuntimeException("签章合同文件路径不存在"); + } + + File file = FileUtil.file(saveFilePath); if (!FileUtil.exist(file)) { - log.error("签章的电子合同不存在,serNo:{},signFilePath:{}", sysMqRecord.getBizNo(), signFilePath); - lmtSignRecordVO.setSignMsg("签章的电子合同不存在,serNo:{},signFilePath:{}" + sysMqRecord.getBizNo() + signFilePath); + log.error("签章的电子合同不存在,serNo:{},signFilePath:{}", sysMqRecord.getBizNo(), saveFilePath); return false; } - sftpUtil.upload(backSftpPath, signFilePath); - sysMqRecord.setData(JSONUtil.toJsonStr(lmtSignRecordVO)); - return true; + + // 调用接口进行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)); + return true; + } + } + return false; } + } \ No newline at end of file diff --git a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxfold/MsxfLoanDetailFileTasklet.java b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxfold/MsxfLoanDetailFileTasklet.java index 966a9a9..4219690 100644 --- a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxfold/MsxfLoanDetailFileTasklet.java +++ b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxfold/MsxfLoanDetailFileTasklet.java @@ -3,6 +3,8 @@ 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; @@ -62,6 +64,9 @@ public class MsxfLoanDetailFileTasklet extends BaseBatchTasklet { @Resource private RedissonClient redissonClient; + @Resource + private FacLoanDuebillMapper facLoanDuebillMapper; + private static final String[] CALC_FIELD = { "biz_date", "contNo", @@ -89,7 +94,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).plusDays(-1); + date = LocalDate.parse(tranDate); } else { RBucket redisPreDate = redissonClient.getBucket(SysRedisConstant.PREDATE); date = redisPreDate.get(); @@ -102,12 +107,22 @@ public class MsxfLoanDetailFileTasklet extends BaseBatchTasklet { queryWrapper.lambda().eq(CtrlLoanDetail::getPrdCode,prdCode); ctrlLoanDetailService.remove(queryWrapper); + /*QueryWrapper 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); diff --git a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxfold/MsxfRepayFileTasklet.java b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxfold/MsxfRepayFileTasklet.java index 913cca1..adfd6ac 100644 --- a/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxfold/MsxfRepayFileTasklet.java +++ b/loan-parent/loan-batch-internet/loan-batch-internet-application/src/main/java/com/zkj/loan/batch/tasklet/msxfold/MsxfRepayFileTasklet.java @@ -2,15 +2,19 @@ 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; @@ -64,7 +68,8 @@ public class MsxfRepayFileTasklet extends BaseBatchTasklet { @Resource private IdGenerator idGenerator; - + @Resource + private BizLoanClaimRepayMapper bizLoanClaimRepayMapper; @Resource private CtrlRepayDetailService ctrlRepayDetailService; @@ -115,12 +120,18 @@ 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.setCreateData(LocalDate.now()); + repayDetail.setCreateDate(LocalDate.now()); repayDetail.setCreateTime(LocalDateTime.now()); + repayDetail.setUpdateDate(LocalDate.now()); + repayDetail.setUpdateTime(LocalDateTime.now()); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CtrlRepayDetail::getBizDate,dateStr); diff --git a/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/java/com/zkj/loan/common/internet/mapper/biz/BizLoanClaimRepayMapper.java b/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/java/com/zkj/loan/common/internet/mapper/biz/BizLoanClaimRepayMapper.java index 899a4c9..fe26184 100644 --- a/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/java/com/zkj/loan/common/internet/mapper/biz/BizLoanClaimRepayMapper.java +++ b/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/java/com/zkj/loan/common/internet/mapper/biz/BizLoanClaimRepayMapper.java @@ -32,6 +32,9 @@ public interface BizLoanClaimRepayMapper extends BaseMapper { int countByBizDate(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("coopNo") String coopNo); - + List selectClaimCustList(@Param("createDate") LocalDate createDate,@Param("isUpdate") Boolean isUpdate); + + BizLoanClaimRepay countClaimData(@Param("bizDate")String dateStr,@Param("coopNo") String chanCode, @Param("prdCode")String prdCode); + } diff --git a/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/biz/BizLoanClaimRepayMapper.xml b/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/biz/BizLoanClaimRepayMapper.xml index 1c98879..8a09ad7 100644 --- a/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/biz/BizLoanClaimRepayMapper.xml +++ b/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/biz/BizLoanClaimRepayMapper.xml @@ -94,42 +94,42 @@ @@ -143,4 +143,14 @@ + + + diff --git a/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/fac/LoanDetailsMapper.xml b/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/fac/LoanDetailsMapper.xml index b68ddbb..e2c94ac 100644 --- a/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/fac/LoanDetailsMapper.xml +++ b/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/fac/LoanDetailsMapper.xml @@ -38,7 +38,7 @@ - id, + id, biz_date, cont_no, duebill_no, @@ -84,9 +84,9 @@ from fac_loan_details - - and coop_no = #{coopNo} - + + and coop_no = #{coopNo} + group by (case @@ -208,24 +208,24 @@ @@ -282,11 +282,12 @@ select diff --git a/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/sys/SysMqRecordMapper.xml b/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/sys/SysMqRecordMapper.xml index cfb0938..0faa56f 100644 --- a/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/sys/SysMqRecordMapper.xml +++ b/loan-parent/loan-common-internet/loan-common-internet-mapper/src/main/resources/mapper/sys/SysMqRecordMapper.xml @@ -17,30 +17,30 @@ INSERT INTO sys_mq_record ( - id, - biz_type, - biz_no, - data, - status, - biz_date, - create_time, - update_time, - cust_no, - duebill_no + id, + biz_type, + biz_no, + data, + status, + biz_date, + create_time, + update_time, + cust_no, + duebill_no ) VALUES - ( - #{id}, - #{bizType}, - #{bizNo}, - #{data}, - #{status}, - DATE_FORMAT(NOW(), '%Y%m%d'), - NOW(), - NOW(), - #{custNo}, - #{duebillNo} - ) + ( + #{id}, + #{bizType}, + #{bizNo}, + #{data}, + #{status}, + DATE_FORMAT(NOW(), '%Y%m%d'), + NOW(), + NOW(), + #{custNo}, + #{duebillNo} + ) @@ -54,7 +54,8 @@ create_time, update_time, cust_no, - duebill_no + duebill_no, + biz_file_type ) VALUES @@ -64,11 +65,12 @@ #{record.bizNo}, #{record.data}, #{record.status}, - DATE_FORMAT(NOW(), '%Y%m%d'), + #{record.bizDate}, NOW(), NOW(), #{record.custNo}, - #{record.duebillNo} + #{record.duebillNo}, + #{record.bizFileType} ) @@ -89,20 +91,20 @@