From c053dbcd2232ca26f2499a85f22bb863754b8858 Mon Sep 17 00:00:00 2001 From: fanzongzhe <285169773@qq.com> Date: Mon, 15 Apr 2024 17:35:59 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=BE=E6=9C=9F=E5=AF=B9=E8=B4=A6=EF=BC=8C?= =?UTF-8?q?=E5=9E=AB=E6=AC=BE=E4=B8=8B=E8=BD=BDpdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LoanBePadsincereApplyFeign.java | 4 + .../LoanBePadsincereApplyFeignFallback.java | 5 + .../loanoverduefin/LoanOverdueFinFeign.java | 4 + .../LoanBePadsincereApplyRest.java | 5 + .../LoanBePadsincereApplyService.java | 191 +- .../LoanBuckleApplyService.java | 3 + .../LoanMonthlyAccrualApplyService.java | 3 + .../loanoverduefin/LoanOverdueFinRest.java | 5 + .../loanoverduefin/LoanOverdueFinService.java | 169 +- .../LoanRepaymentPlanDetailsMapper.java | 2 + .../LoanRepaymentPlanDetailsMapper.xml | 4 + .../LoanRepaymentPlanDetailsService.java | 4 + .../LoanTransferPaymentApplyService.java | 4 + .../main/resources/ftl/vouchers/overDue.ftl | 2543 +++++++++++++ .../resources/ftl/vouchers/padsincere.ftl | 3317 +++++++++++++++++ .../逾期对账/overDue.ftl | 3 + .../逾期对账/逾期对账.docx | Bin 0 -> 18718 bytes 17 files changed, 6260 insertions(+), 6 deletions(-) create mode 100644 anrui-riskcenter/anrui-riskcenter-biz/src/main/resources/ftl/vouchers/overDue.ftl create mode 100644 anrui-riskcenter/anrui-riskcenter-biz/src/main/resources/ftl/vouchers/padsincere.ftl create mode 100644 工作内容需要的文档/单据模板/财务凭证打印模板/逾期对账/overDue.ftl create mode 100644 工作内容需要的文档/单据模板/财务凭证打印模板/逾期对账/逾期对账.docx diff --git a/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanbepadsincereapply/LoanBePadsincereApplyFeign.java b/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanbepadsincereapply/LoanBePadsincereApplyFeign.java index 1f4b41caa5..125a9c72c0 100644 --- a/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanbepadsincereapply/LoanBePadsincereApplyFeign.java +++ b/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanbepadsincereapply/LoanBePadsincereApplyFeign.java @@ -87,6 +87,10 @@ public interface LoanBePadsincereApplyFeign { @ResponseBody public ResultBean delBySids(@RequestBody String[] sids); + @ApiOperation("下载垫还审批dpf") + @PostMapping("/bepadsincereCreatePdf") + public ResultBean bepadsincereCreatePdf(@RequestParam("sid") String sid); + @ApiOperation("根据SID获取一条记录") @GetMapping("/fetchDetailsBySid/{sid}") @ResponseBody diff --git a/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanbepadsincereapply/LoanBePadsincereApplyFeignFallback.java b/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanbepadsincereapply/LoanBePadsincereApplyFeignFallback.java index 00c67078f1..b613a93c98 100644 --- a/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanbepadsincereapply/LoanBePadsincereApplyFeignFallback.java +++ b/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanbepadsincereapply/LoanBePadsincereApplyFeignFallback.java @@ -75,6 +75,11 @@ public class LoanBePadsincereApplyFeignFallback implements LoanBePadsincereApply return ResultBean.fireFail().setMsg("接口anrui-riskcenter/loanbepadsincereapply/delBySids无法访问"); } + @Override + public ResultBean bepadsincereCreatePdf(String sid) { + return null; + } + @Override public ResultBean fetchDetailsBySid(String sid){ ResultBean rb = ResultBean.fireFail(); diff --git a/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanoverduefin/LoanOverdueFinFeign.java b/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanoverduefin/LoanOverdueFinFeign.java index 815ef4e003..4ae1b3bcf5 100644 --- a/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanoverduefin/LoanOverdueFinFeign.java +++ b/anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loanoverduefin/LoanOverdueFinFeign.java @@ -43,6 +43,10 @@ public interface LoanOverdueFinFeign { @ApiOperation(value = "下载模板") public void downloadExcel(); + @ApiOperation("下载逾期对账审批dpf") + @PostMapping("/overdueCreatePdf") + public ResultBean overdueCreatePdf(@RequestParam("sid") String sid); + @ApiOperation(value = "导入") @PostMapping("/getExcelInfo") ResultBean> getExcelInfo(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request, @RequestParam(value = "useOrgSid") String useOrgSid) throws IOException; diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbepadsincereapply/LoanBePadsincereApplyRest.java b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbepadsincereapply/LoanBePadsincereApplyRest.java index 3689c022f4..1e3b5b3bf0 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbepadsincereapply/LoanBePadsincereApplyRest.java +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbepadsincereapply/LoanBePadsincereApplyRest.java @@ -122,6 +122,11 @@ public class LoanBePadsincereApplyRest implements LoanBePadsincereApplyFeign { return loanBePadsincereApplyService.delAllBySids(sids); } + @Override + public ResultBean bepadsincereCreatePdf(String sid) { + return loanBePadsincereApplyService.bepadsincereCreatePdf(sid); + } + @Override @ApiOperation("根据SID获取一条记录") @GetMapping("/fetchDetailsBySid/{sid}") diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbepadsincereapply/LoanBePadsincereApplyService.java b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbepadsincereapply/LoanBePadsincereApplyService.java index a52cbcc44d..50f57dbd7f 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbepadsincereapply/LoanBePadsincereApplyService.java +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbepadsincereapply/LoanBePadsincereApplyService.java @@ -62,6 +62,7 @@ import com.yxt.anrui.flowable.api.flowtask.FlowTaskVo; import com.yxt.anrui.flowable.api.flowtask.LatestTaskVo; import com.yxt.anrui.flowable.api.utils.ProcDefEnum; import com.yxt.anrui.flowable.sqloperationsymbol.BusinessVariables; +import com.yxt.anrui.portal.api.flow.PCHistTaskListAndCommentList; import com.yxt.anrui.portal.api.sysorganization.SysOrganizationFeign; import com.yxt.anrui.portal.api.sysorganization.SysOrganizationVo; import com.yxt.anrui.portal.api.sysstafforg.SysStaffOrgFeign; @@ -75,21 +76,30 @@ import com.yxt.anrui.riskcenter.api.loanbepadsincereveh.LoanBePadsincereVehDetai import com.yxt.anrui.riskcenter.api.loanbepadsincereveh.LoanBePadsincereVehDto; import com.yxt.anrui.riskcenter.api.loanfile.LoanFile; import com.yxt.anrui.riskcenter.api.loanfile.LoanFileEnum; +import com.yxt.anrui.riskcenter.api.loanmonthlyaccrualapply.MonthlyAccrualSourceLCVo; import com.yxt.anrui.riskcenter.api.loanrepaymenthistory.LoanRepaymentHistory; import com.yxt.anrui.riskcenter.api.loanrepaymentplandetails.LoanPlanDetailsVoForFundVoucher; import com.yxt.anrui.riskcenter.api.loanrepaymentplandetails.LoanRepaymentPlanDetails; import com.yxt.anrui.riskcenter.api.loanrepaymentplandetails.LoanRepaymentPlanMoneyVo; import com.yxt.anrui.riskcenter.api.loanrepaymentschedule.LoanRepaymentScheduleDetailsVo; +import com.yxt.anrui.riskcenter.api.loantransferpaymentapply.LoanTransferPaymentApply; +import com.yxt.anrui.riskcenter.api.loantransferpaymentapply.LoanTransferPaymentRecordVo; import com.yxt.anrui.riskcenter.api.loantransferpaymentrecord.LoanTransferPaymentRecord; import com.yxt.anrui.riskcenter.biz.loanbepadsincereveh.LoanBePadsincereVehService; import com.yxt.anrui.riskcenter.biz.loanfile.LoanFileService; import com.yxt.anrui.riskcenter.biz.loanrepaymentplandetails.LoanRepaymentPlanDetailsService; import com.yxt.anrui.riskcenter.biz.loanrepaymentschedule.LoanRepaymentScheduleService; +import com.yxt.common.base.config.component.DocPdfComponent; import com.yxt.common.base.config.component.FileUploadComponent; +import com.yxt.common.base.utils.ConstantUtils; import com.yxt.common.base.utils.DateUtils; +import com.yxt.common.base.utils.WordConvertUtils; +import com.yxt.messagecenter.api.message.Message; import com.yxt.messagecenter.api.message.MessageFeign; import com.yxt.messagecenter.api.message.MessageFlowVo; import com.yxt.messagecenter.api.message.MessageFlowableQuery; +import com.yxt.messagecenter.api.messagelist.MessageList; +import com.yxt.messagecenter.api.messagelist.MessageListFeign; import org.apache.commons.lang3.StringUtils; import com.yxt.common.base.service.MybatisBaseService; import com.yxt.common.base.utils.PagerUtil; @@ -119,6 +129,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import static java.util.Comparator.comparing; + /** * Project: anrui-riskcenter(垫款申请)
* File: LoanBePadsincereApplyService.java
@@ -134,7 +146,12 @@ import java.util.stream.Collectors; */ @Service public class LoanBePadsincereApplyService extends MybatisBaseService { - + @Autowired + private DocPdfComponent docPdfComponent; + @Autowired + private MessageListFeign messageListFeign; + @Autowired + private com.yxt.anrui.portal.api.flow.FlowableFeign flowableFeignPro; @Autowired private SysUserFeign sysUserFeign; @Autowired @@ -468,8 +485,8 @@ public class LoanBePadsincereApplyService extends MybatisBaseService bepadsincereCreatePdf(String sid) { + ResultBean rb = ResultBean.fireFail(); + String finalPath = ""; + String filePath = ""; + Map dataMap = new HashMap(); + List> newList = new ArrayList<>(); + LoanBePadsincereApply data = fetchBySid(sid); + if (null != data) { + if (!data.getNodeState().equals("已办结")) { + return rb.setMsg("无法下载没有办结的审批记录。"); + } + List files = loanFileService.selectByLinkSid(data.getSid(), LoanFileEnum.BEPADSINCERE.getAttachType()); + if (!files.isEmpty()) { + List stringList = new ArrayList<>(); + for (LoanFile file : files) { + if (StringUtils.isNotBlank(file.getFileName()) && StringUtils.isNotBlank(file.getFileType())) { + stringList.add(file.getFileName() + "." + file.getFileType()); + } + } + if (!stringList.isEmpty()) { + filePath = String.join(",", stringList); + } + } + dataMap.put("createTime", DateUtil.formatDate(data.getCreateTime())); + if (StringUtils.isNotBlank(data.getUseOrgName())) { + dataMap.put("company", data.getUseOrgName()); + } + if (StringUtils.isNotBlank(data.getCreateByName())) { + dataMap.put("applyName", data.getCreateByName()); + } + if (StringUtils.isNotBlank(data.getDeptName())) { + dataMap.put("dept", data.getDeptName()); + } + if (StringUtils.isNotBlank(data.getBillNo())) { + dataMap.put("billNo", data.getBillNo()); + } + if (StringUtils.isNotBlank(data.getFinPaymentFormValue())) { + dataMap.put("payWay", data.getFinPaymentFormValue()); + } + if (StringUtils.isNotBlank(data.getPaymentRemarks())) { + dataMap.put("payRemarks", data.getPaymentRemarks()); + } + if (StringUtils.isNotBlank(data.getRemarks())) { + dataMap.put("otherShow", data.getRemarks()); + } + if (StringUtils.isNotBlank(filePath)) { + dataMap.put("filePath", filePath); + } + BigDecimal sumMoney = new BigDecimal(0); + //获取审批记录 + if (StringUtils.isNotBlank(data.getProcInstSid())) { + List flowRecordVo = flowableFeignPro.flowRecordAndComment(data.getProcInstSid(), "1").getData(); + List sourceLCVos = new ArrayList<>(); + for (PCHistTaskListAndCommentList flowTask : flowRecordVo) { + if (flowTask.getFlowableRecordVo() != null) { + Map flowableRecordVo = flowTask.getFlowableRecordVo(); + MonthlyAccrualSourceLCVo sourceLCVo = new MonthlyAccrualSourceLCVo(); + List> taskUserInfos = ConstantUtils.getListData(flowableRecordVo, "taskUserInfos"); + Map comment = ConstantUtils.getMap(flowableRecordVo, "comment"); + String assigneeName = (String) taskUserInfos.get(0).get("assigneeName"); + String comment1 = (String) comment.get("comment"); + sourceLCVo.setName(assigneeName); + sourceLCVo.setComment(comment1); + sourceLCVo.setSpsj(flowableRecordVo.get("finishTime").toString()); + sourceLCVos.add(sourceLCVo); + } else { + Map processCommentVo = flowTask.getProcessCommentVo(); + MonthlyAccrualSourceLCVo sourceLCVo = new MonthlyAccrualSourceLCVo(); + sourceLCVo.setName(processCommentVo.get("title").toString()); + sourceLCVo.setComment(processCommentVo.get("content").toString()); + sourceLCVo.setSpsj(processCommentVo.get("time").toString()); + sourceLCVos.add(sourceLCVo); + } + } + List messages = messageFeign.selectByBusinessSid(data.getSid()).getData(); + if (messages.size() > 0) { + for (Message message : messages) { + MonthlyAccrualSourceLCVo sourceLCVo = new MonthlyAccrualSourceLCVo(); + String receiverNames = ""; + List messageLists = messageListFeign.fetchByMainSid(message.getSid()).getData(); + if (messageLists.size() > 0) { + for (MessageList messageList : messageLists) { + receiverNames = receiverNames + messageList.getReceiverName() + ","; + } + } + sourceLCVo.setName("系统"); + sourceLCVo.setComment("抄送 " + receiverNames.substring(0, receiverNames.lastIndexOf(","))); + sourceLCVo.setSpsj(DateUtil.format(message.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + sourceLCVos.add(sourceLCVo); + } + } + sourceLCVos.sort(comparing(MonthlyAccrualSourceLCVo::getSpsj)); + dataMap.put("lcList", sourceLCVos); + } + List records = loanBePadsincereVehService.selByMainSid(sid); + if (!records.isEmpty()) { + int sortNo = 1; + for (LoanBePadsincereVehDetailsVo record : records) { + Map map = new HashMap<>(); + LoanRepaymentPlanDetails details = loanRepaymentPlanDetailsService.fetchMainBankByBusVinSid(record.getBusVinSid()); + if (null != details) { + map.put("sortNo", String.valueOf(sortNo++)); + if (StringUtils.isNotBlank(record.getLoanContractNo())) { + map.put("loanNo", record.getLoanContractNo()); + } + if (StringUtils.isNotBlank(details.getDept())) { + map.put("saleDept", details.getDept()); + } + if (StringUtils.isNotBlank(record.getVinNo())) { + map.put("vinNo", record.getVinNo()); + } + if (StringUtils.isNotBlank(record.getBankName())) { + map.put("bankName", record.getBankName()); + } + if (StringUtils.isNotBlank(record.getBankContractNo())) { + map.put("bankNo", record.getBankContractNo()); + } + if (StringUtils.isNotBlank(record.getBorrowerName())) { + map.put("borrowerName", record.getBorrowerName()); + } + if (StringUtils.isNotBlank(record.getPeriod())) { + map.put("period", record.getPeriod()); + } + if (StringUtils.isNotBlank(record.getSysBeMoney())) { + map.put("overDueMoney", record.getSysBeMoney()); + } + if (StringUtils.isNotBlank(record.getBankBeMoney())) { + map.put("bankOverMoney", record.getBankBeMoney()); + } + if (StringUtils.isNotBlank(record.getBankBeInter())) { + map.put("beInter", record.getBankBeInter()); + } + if (StringUtils.isNotBlank(record.getPadMoney())) { + map.put("padMoney", record.getPadMoney()); + sumMoney = sumMoney.add(new BigDecimal(record.getPadMoney())); + } + } + newList.add(map); + } + dataMap.put("amount", sumMoney.toString()); + } + dataMap.put("newList", newList); + String temp = "/template/"; + String targetPath = docPdfComponent.getUploadTemplateUrl(); + try { + //获取模板 + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("ftl/vouchers/padsincere.ftl"); + //生成word文件名 + String dateStr = DateUtil.format(new Date(), "yyyyMMdd"); + long seconds = System.currentTimeMillis(); + String typeName = dateStr + seconds + ".doc"; + File file = new File(targetPath + "templateVouchers" + seconds + ".ftl"); + File dir = new File(targetPath); + WordConvertUtils.inputStreamToFile(inputStream, file); + WordConvertUtils.creatWord1(dataMap, file, targetPath, typeName, dir); + //新生成的word路径 + String wordPath = targetPath + typeName; + String pdfName = "垫还审批" + dateStr + seconds + ".pdf"; + WordConvertUtils.doc2pdf(wordPath, targetPath, pdfName); + finalPath = temp + pdfName; + } catch (NoClassDefFoundError e) { + e.printStackTrace(); + finalPath = targetPath; + } + } + return rb.success().setData(finalPath); + } } \ No newline at end of file diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbuckleapply/LoanBuckleApplyService.java b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbuckleapply/LoanBuckleApplyService.java index 45ba50d5ea..fac946a81c 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbuckleapply/LoanBuckleApplyService.java +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanbuckleapply/LoanBuckleApplyService.java @@ -1238,6 +1238,9 @@ public class LoanBuckleApplyService extends MybatisBaseService> newList = new ArrayList<>(); LoanBuckleApply data = fetchBySid(sid); if (null != data) { + if (!data.getNodeState().equals("已办结")) { + return rb.setMsg("无法下载没有办结的审批记录。"); + } List files = loanFileService.selectByLinkSid(data.getSid(), LoanFileEnum.BUCKLE_APPLY.getAttachType()); if (!files.isEmpty()) { List stringList = new ArrayList<>(); diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanmonthlyaccrualapply/LoanMonthlyAccrualApplyService.java b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanmonthlyaccrualapply/LoanMonthlyAccrualApplyService.java index f496d99818..c72924fa43 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanmonthlyaccrualapply/LoanMonthlyAccrualApplyService.java +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanmonthlyaccrualapply/LoanMonthlyAccrualApplyService.java @@ -1053,6 +1053,9 @@ public class LoanMonthlyAccrualApplyService extends MybatisBaseService> newList = new ArrayList<>(); LoanMonthlyAccrualApply data = fetchBySid(sid); if (null != data) { + if (!data.getNodeState().equals("已办结")) { + return rb.setMsg("无法下载没有办结的审批记录。"); + } List files = loanFileService.selectByLinkSid(data.getSid(), LoanFileEnum.ACCRUALAPPLY.getAttachType()); if (!files.isEmpty()) { List stringList = new ArrayList<>(); diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanoverduefin/LoanOverdueFinRest.java b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanoverduefin/LoanOverdueFinRest.java index 60db54ab9f..e667c24757 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanoverduefin/LoanOverdueFinRest.java +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanoverduefin/LoanOverdueFinRest.java @@ -71,6 +71,11 @@ public class LoanOverdueFinRest implements LoanOverdueFinFeign { ExportExcelUtils.export(fileNameURL, list, DownloadExcelVo.class, response); } + @Override + public ResultBean overdueCreatePdf(String sid) { + return loanOverdueFinService.overdueCreatePdf(sid); + } + @Override public ResultBean> getExcelInfo(MultipartFile file, HttpServletRequest request,String useOrgSid) throws IOException { return loanOverdueFinService.getExcelInfo(file, request,useOrgSid); diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanoverduefin/LoanOverdueFinService.java b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanoverduefin/LoanOverdueFinService.java index 0f33ca55bd..eadd9c4f10 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanoverduefin/LoanOverdueFinService.java +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanoverduefin/LoanOverdueFinService.java @@ -12,6 +12,7 @@ import com.yxt.anrui.base.common.enums.BillTypeEnum; import com.yxt.anrui.base.common.utils.Rule; import com.yxt.anrui.base.common.utils.domain.BillNo; import com.yxt.anrui.buscenter.api.bussalesorder.BusSalesOrder; +import com.yxt.anrui.buscenter.api.bussalesordervehicle.BusSalesOrderVehicleFeign; import com.yxt.anrui.flowable.api.flow.FlowableFeign; import com.yxt.anrui.flowable.api.flow.UpdateFlowFieldVo; import com.yxt.anrui.flowable.api.flow2.FlowDelegateQuery; @@ -21,6 +22,7 @@ import com.yxt.anrui.flowable.api.flowtask.FlowTaskVo; import com.yxt.anrui.flowable.api.flowtask.LatestTaskVo; import com.yxt.anrui.flowable.api.utils.ProcDefEnum; import com.yxt.anrui.flowable.sqloperationsymbol.BusinessVariables; +import com.yxt.anrui.portal.api.flow.PCHistTaskListAndCommentList; import com.yxt.anrui.portal.api.sysorganization.SysOrganizationFeign; import com.yxt.anrui.portal.api.sysorganization.SysOrganizationVo; import com.yxt.anrui.portal.api.sysstafforg.SysStaffOrgFeign; @@ -28,6 +30,11 @@ import com.yxt.anrui.portal.api.sysuser.PrivilegeQuery; import com.yxt.anrui.portal.api.sysuser.SysUserFeign; import com.yxt.anrui.portal.api.sysuser.SysUserVo; import com.yxt.anrui.riskcenter.api.loanbepadsincereapply.ReturnExcelInfo; +import com.yxt.anrui.riskcenter.api.loanbuckleapply.LoanBuckleApply; +import com.yxt.anrui.riskcenter.api.loanbuckleapplyrecord.LoanBuckleApplyRecord; +import com.yxt.anrui.riskcenter.api.loanfile.LoanFile; +import com.yxt.anrui.riskcenter.api.loanfile.LoanFileEnum; +import com.yxt.anrui.riskcenter.api.loanmonthlyaccrualapply.MonthlyAccrualSourceLCVo; import com.yxt.anrui.riskcenter.api.loanoverduefin.*; import com.yxt.anrui.riskcenter.api.loanoverduefin.flowable.OverFinApplyDelegateQuery; import com.yxt.anrui.riskcenter.api.loanoverduefin.flowable.OverdueApplyNodeQuery; @@ -35,17 +42,25 @@ import com.yxt.anrui.riskcenter.api.loanoverduefin.flowable.OverdueApplyNodeVo; import com.yxt.anrui.riskcenter.api.loanoverduefin.flowable.OverdueApplyTaskQuery; import com.yxt.anrui.riskcenter.api.loanoverduefindetails.LoanOverdueFinAppDetailsVo; import com.yxt.anrui.riskcenter.api.loanoverduefindetails.LoanOverdueFinDetailsDto; +import com.yxt.anrui.riskcenter.api.loanrepaymentplandetails.LoanRepaymentPlanDetails; import com.yxt.anrui.riskcenter.api.loanrepaymentschedule.LoanRepaymentScheduleDetailsVo; import com.yxt.anrui.riskcenter.biz.loanoverduefindetails.LoanOverdueFinDetailsService; +import com.yxt.anrui.riskcenter.biz.loanrepaymentplandetails.LoanRepaymentPlanDetailsService; +import com.yxt.common.base.config.component.DocPdfComponent; import com.yxt.common.base.config.component.FileUploadComponent; import com.yxt.common.base.service.MybatisBaseService; +import com.yxt.common.base.utils.ConstantUtils; import com.yxt.common.base.utils.PagerUtil; +import com.yxt.common.base.utils.WordConvertUtils; import com.yxt.common.core.query.PagerQuery; import com.yxt.common.core.result.ResultBean; import com.yxt.common.core.vo.PagerVo; +import com.yxt.messagecenter.api.message.Message; import com.yxt.messagecenter.api.message.MessageFeign; import com.yxt.messagecenter.api.message.MessageFlowVo; import com.yxt.messagecenter.api.message.MessageFlowableQuery; +import com.yxt.messagecenter.api.messagelist.MessageList; +import com.yxt.messagecenter.api.messagelist.MessageListFeign; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; @@ -66,6 +81,8 @@ import java.util.*; import java.util.concurrent.*; import java.util.stream.Collectors; +import static java.util.Comparator.comparing; + /** * @description: * @author: dimengzhe @@ -74,6 +91,10 @@ import java.util.stream.Collectors; @Service public class LoanOverdueFinService extends MybatisBaseService { + @Autowired + private MessageListFeign messageListFeign; + @Autowired + private com.yxt.anrui.portal.api.flow.FlowableFeign flowableFeignPro; @Autowired private SysUserFeign sysUserFeign; @Autowired @@ -92,6 +113,10 @@ public class LoanOverdueFinService extends MybatisBaseService listPageVo(PagerQuery pq) { LoanOverdueFinQuery query = pq.getParams(); @@ -244,7 +269,7 @@ public class LoanOverdueFinService extends MybatisBaseService loanRepaymentScheduleDetailsVos = loanOverdueFinDetailsService.selectByCustomerNo(excelFinVo.getCustomerNo(), useOrgSid); loanRepaymentScheduleDetailsVos.removeAll(Collections.singleton(null)); @@ -894,4 +919,142 @@ public class LoanOverdueFinService extends MybatisBaseService overdueCreatePdf(String sid) { + ResultBean rb = ResultBean.fireFail(); + String finalPath = ""; + Map dataMap = new HashMap(); + List> newList = new ArrayList<>(); + LoanOverdueFin data = fetchBySid(sid); + if (null != data) { + if (!data.getNodeState().equals("已办结")) { + return rb.setMsg("无法下载没有办结的审批记录。"); + } + dataMap.put("createTime", DateUtil.formatDate(data.getCreateTime())); + if (StringUtils.isNotBlank(data.getUseOrgName())) { + dataMap.put("company", data.getUseOrgName()); + } + if (StringUtils.isNotBlank(data.getCreateByName())) { + dataMap.put("applyName", data.getCreateByName()); + } + if (StringUtils.isNotBlank(data.getCreateDept())) { + dataMap.put("dept", data.getCreateDept()); + } + if (StringUtils.isNotBlank(data.getRemarks())) { + dataMap.put("remarks", data.getRemarks()); + } + if (StringUtils.isNotBlank(data.getFiles())) { + dataMap.put("filePath", data.getFiles()); + } + if (StringUtils.isNotBlank(data.getStopDate())) { + dataMap.put("endTime", data.getStopDate()); + } + if (StringUtils.isNotBlank(data.getBillNo())) { + dataMap.put("billNo", data.getBillNo()); + } + //获取审批记录 + if (StringUtils.isNotBlank(data.getProcInstId())) { + List flowRecordVo = flowableFeignPro.flowRecordAndComment(data.getProcInstId(), "1").getData(); + List sourceLCVos = new ArrayList<>(); + for (PCHistTaskListAndCommentList flowTask : flowRecordVo) { + if (flowTask.getFlowableRecordVo() != null) { + Map flowableRecordVo = flowTask.getFlowableRecordVo(); + MonthlyAccrualSourceLCVo sourceLCVo = new MonthlyAccrualSourceLCVo(); + List> taskUserInfos = ConstantUtils.getListData(flowableRecordVo, "taskUserInfos"); + Map comment = ConstantUtils.getMap(flowableRecordVo, "comment"); + String assigneeName = (String) taskUserInfos.get(0).get("assigneeName"); + String comment1 = (String) comment.get("comment"); + sourceLCVo.setName(assigneeName); + sourceLCVo.setComment(comment1); + sourceLCVo.setSpsj(flowableRecordVo.get("finishTime").toString()); + sourceLCVos.add(sourceLCVo); + } else { + Map processCommentVo = flowTask.getProcessCommentVo(); + MonthlyAccrualSourceLCVo sourceLCVo = new MonthlyAccrualSourceLCVo(); + sourceLCVo.setName(processCommentVo.get("title").toString()); + sourceLCVo.setComment(processCommentVo.get("content").toString()); + sourceLCVo.setSpsj(processCommentVo.get("time").toString()); + sourceLCVos.add(sourceLCVo); + } + } + List messages = messageFeign.selectByBusinessSid(data.getSid()).getData(); + if (messages.size() > 0) { + for (Message message : messages) { + MonthlyAccrualSourceLCVo sourceLCVo = new MonthlyAccrualSourceLCVo(); + String receiverNames = ""; + List messageLists = messageListFeign.fetchByMainSid(message.getSid()).getData(); + if (messageLists.size() > 0) { + for (MessageList messageList : messageLists) { + receiverNames = receiverNames + messageList.getReceiverName() + ","; + } + } + sourceLCVo.setName("系统"); + sourceLCVo.setComment("抄送 " + receiverNames.substring(0, receiverNames.lastIndexOf(","))); + sourceLCVo.setSpsj(DateUtil.format(message.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + sourceLCVos.add(sourceLCVo); + } + } + sourceLCVos.sort(comparing(MonthlyAccrualSourceLCVo::getSpsj)); + dataMap.put("lcList", sourceLCVos); + } + List records = loanOverdueFinDetailsService.selectByMainSid(sid); + if (!records.isEmpty()) { + int sortNo = 1; + for (LoanOverdueFinDetailsDto applyRecord : records) { + Map map = new HashMap<>(); + LoanRepaymentPlanDetails details = loanRepaymentPlanDetailsService.fetchMainBankByBusVinSid(applyRecord.getBusVinSid()); + if (null != details) { + map.put("sortNo", String.valueOf(sortNo++)); + if (StringUtils.isNotBlank(details.getLoanContractNo())) { + map.put("loanNo", details.getLoanContractNo()); + } + if (StringUtils.isNotBlank(details.getVinNo())) { + map.put("vinNo", details.getVinNo()); + } + if (StringUtils.isNotBlank(details.getBorrowerName())) { + map.put("borrowerName", details.getBorrowerName()); + } + if (StringUtils.isNotBlank(details.getDept())) { + map.put("saleDept", details.getDept()); + } + if (StringUtils.isNotBlank(applyRecord.getOverdueMoney())) { + map.put("overDueMoney", applyRecord.getOverdueMoney()); + } + if (StringUtils.isNotBlank(applyRecord.getTiredDeficiency())) { + map.put("tiredMoney", applyRecord.getTiredDeficiency()); + } + if (StringUtils.isNotBlank(applyRecord.getDiffMoney())) { + map.put("diffMoney", applyRecord.getDiffMoney()); + } + + } + newList.add(map); + } + } + dataMap.put("newList", newList); + String temp = "/template/"; + String targetPath = docPdfComponent.getUploadTemplateUrl(); + try { + //获取模板 + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("ftl/vouchers/overDue.ftl"); + //生成word文件名 + String dateStr = DateUtil.format(new Date(), "yyyyMMdd"); + long seconds = System.currentTimeMillis(); + String typeName = dateStr + seconds + ".doc"; + File file = new File(targetPath + "templateVouchers" + seconds + ".ftl"); + File dir = new File(targetPath); + WordConvertUtils.inputStreamToFile(inputStream, file); + WordConvertUtils.creatWord1(dataMap, file, targetPath, typeName, dir); + //新生成的word路径 + String wordPath = targetPath + typeName; + String pdfName = "逾期对账审批" + dateStr + seconds + ".pdf"; + WordConvertUtils.doc2pdf(wordPath, targetPath, pdfName); + finalPath = temp + pdfName; + } catch (NoClassDefFoundError e) { + e.printStackTrace(); + finalPath = targetPath; + } + } + return rb.success().setData(finalPath); + } } diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsMapper.java b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsMapper.java index 7a9d47a528..56213f3f25 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsMapper.java +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsMapper.java @@ -77,4 +77,6 @@ public interface LoanRepaymentPlanDetailsMapper extends BaseMapper selPushLaterVoucherOnBuckle(@Param("planSids") List planSids); + + LoanRepaymentPlanDetails fetchMainBankByBusVinSid(@Param("busVinSid") String busVinSid); } diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsMapper.xml b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsMapper.xml index adf22353b4..f23e685cd8 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsMapper.xml +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsMapper.xml @@ -770,4 +770,8 @@ #{item} + \ No newline at end of file diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsService.java b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsService.java index eed2a60d16..66a54de13e 100644 --- a/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsService.java +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loanrepaymentplandetails/LoanRepaymentPlanDetailsService.java @@ -313,4 +313,8 @@ public class LoanRepaymentPlanDetailsService extends MybatisBaseService> newList = new ArrayList<>(); LoanTransferPaymentApply data = fetchBySid(sid); if (null != data) { + if (!data.getNodeState().equals("已办结")) { + return rb.setMsg("无法下载没有办结的审批记录。"); + } List files = loanFileService.selectByLinkSid(data.getSid(), LoanFileEnum.TRANSFERPAYMENT.getAttachType()); if (!files.isEmpty()) { List stringList = new ArrayList<>(); @@ -1441,6 +1444,7 @@ public class LoanTransferPaymentApplyService extends MybatisBaseService + + + Administrator + FAN + 2024-04-12T01:09:00Z + 2024-04-15T07:13:49Z + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 14 + + + 2052-12.1.0.16729 + 7281521D75904346990AE39D0AD590E0_13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 逾期对账审批 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${company!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 申请时间:${createTime!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 审批编号:${billNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 申请人: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${applyName!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 申请部门: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${dept!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 数据截止时间: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${endTime!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 备注: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${remarks!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 附件: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${filePath!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 审批流程 + + + + + <#list lcList as lc> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${lc.comment!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${lc.name!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${lc.spsj!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 逾期客户列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 序号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 贷款合同号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 车架号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 贷款人 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 销售部门 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 平台逾期金额 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 财务累欠金额 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 差异金额 + + + + + <#list newList as list> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.sortNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.loanNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.vinNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.borrowerName!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.saleDept!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.overDueMoney!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.tiredMoney!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.diffMoney!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PAGE \* MERGEFORMAT + + + + + + 1 + + + + + + 页 共 + + + + + + NUMPAGES \* MERGEFORMAT + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/anrui-riskcenter/anrui-riskcenter-biz/src/main/resources/ftl/vouchers/padsincere.ftl b/anrui-riskcenter/anrui-riskcenter-biz/src/main/resources/ftl/vouchers/padsincere.ftl new file mode 100644 index 0000000000..16e26eacfd --- /dev/null +++ b/anrui-riskcenter/anrui-riskcenter-biz/src/main/resources/ftl/vouchers/padsincere.ftl @@ -0,0 +1,3317 @@ + + + + Administrator + FAN + 2024-04-12T01:09:00Z + 2024-04-15T07:44:01Z + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 14 + + + 2052-12.1.0.16729 + 7A074C3E3D084683BAF76777203B3E89_13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 垫还审批 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${company!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 申请时间:${createTime!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 审批编号:${billNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 申请人: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${applyName!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 申请部门: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${dept!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 财务付款形式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${payWay!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 付款时需要备注内容: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${payRemarks!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 垫还总金额: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${amount!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 其他说明: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${otherShow!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 附件: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${filePath!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 审批流程 + + + + + <#list lcList as lc> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${lc.comment!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${lc.name!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${lc.spsj!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 垫还明细 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 序号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 贷款合同号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 销售部门 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 资方 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 资方合同号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 车架号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 贷款人 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 期数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 平台逾期月还 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 资方逾期月还 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 资方逾期利息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 垫款金额 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 资方收款账户账号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 备注 + + + + + <#list newList as list> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.sortNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.loanNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.saleDept!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.bankName!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.bankNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.vinNo!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.borrowerName!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.period!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.overDueMoney!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.bankOverMoney!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.beInter!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.padMoney!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.accNumber!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${list.remarks!} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PAGE \* MERGEFORMAT + + + + + + 1 + + + + + + 页 共 + + + + + + NUMPAGES \* MERGEFORMAT + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/工作内容需要的文档/单据模板/财务凭证打印模板/逾期对账/overDue.ftl b/工作内容需要的文档/单据模板/财务凭证打印模板/逾期对账/overDue.ftl new file mode 100644 index 0000000000..a9de1375e3 --- /dev/null +++ b/工作内容需要的文档/单据模板/财务凭证打印模板/逾期对账/overDue.ftl @@ -0,0 +1,3 @@ + + +AdministratorFAN2024-04-12T01:09:00Z2024-04-15T07:13:49Z0100000142052-12.1.0.167297281521D75904346990AE39D0AD590E0_13逾期对账审批 ${company!}申请时间:${createTime!}审批编号:${billNo!}申请人:${applyName!}申请部门:${dept!}数据截止时间:${endTime!}备注:${remarks!}附件:${filePath!}审批流程${lc.comment!}${lc.name!}${lc.spsj!}逾期客户列表序号贷款合同号车架号贷款人销售部门平台逾期金额财务累欠金额差异金额${list.sortNo!}${list.loanNo!}${list.vinNo!}${list.borrowerName!}${list.saleDept!}${list.overDueMoney!}${list.tiredMoney!}${list.diffMoney!} PAGE \* MERGEFORMAT 1 页 共 NUMPAGES \* MERGEFORMAT 1 \ No newline at end of file diff --git a/工作内容需要的文档/单据模板/财务凭证打印模板/逾期对账/逾期对账.docx b/工作内容需要的文档/单据模板/财务凭证打印模板/逾期对账/逾期对账.docx new file mode 100644 index 0000000000000000000000000000000000000000..2718bdd1e7cce305776e61fa03bf444c684c033f GIT binary patch literal 18718 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