/*** 计算两个日期之间的天数* @param smdate -起始日期* @param bdate  -截至日期* @return* @throws ParseException*/
public static Integer daysBetween(String smdate,String bdate) throws ParseException {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(smdate));long time1 = cal.getTimeInMillis();cal.setTime(sdf.parse(bdate));long time2 = cal.getTimeInMillis();long between_days=(time2-time1)/(1000*3600*24);return Integer.parseInt(String.valueOf(between_days));
}
/*** 按提款信息生成还本计划* 暂时只有一次还本* @return*/
public static  FinancTransWrRepayRo  getRepayDetail(FinancTransWrListBo bo ) throws ParseException {String pch = bo.getWithdrawalPc();//批次号String startTime = bo.getWithdrawalStartDate();//提款开始日String endTime = bo.getWithdrawalEndDate();//提款到期日BigDecimal hkAmount = bo.getWithdrawalAmount();FinancTransWrRepayRo repayRo = new FinancTransWrRepayRo();repayRo.setWithdrawalPc( pch);repayRo.setPlanRepayDate( endTime );repayRo.setStartDate( startTime);repayRo.setEndDate( endTime);repayRo.setDays( daysBetween(startTime,endTime));repayRo.setAddFlag("1");repayRo.setRepayAmount( hkAmount);return  repayRo;
}/*** 获取还本列表* @param result* @param pchList* @return*/
public static void getRepayList( WithdrawalInfoRo result ,  List<FinancTransWrListBo> pchList ) throws ParseException {List<FinancTransWrRepayRo> repayRos = result.getTransWrRepays();if( repayRos ==null ){repayRos = new ArrayList<>();}for( FinancTransWrListBo bo : pchList){boolean b = true;while ( b ) {FinancTransWrRepayRo ro = getRepayDetail(bo);if( ro ==null ){break;}b = DateUtils.stringToDate(bo.getWithdrawalEndDate(),"yyyy-MM-dd").getTime() > DateUtils.stringToDate(ro.getEndDate(),"yyyy-MM-dd").getTime();repayRos.add(ro);}}result.setTransWrRepays( repayRos);
}/*** 付息* @param startTime-本期开始时间* @param phase ---支付第几期* @param transWrInfoBo-提款主信息* @param bo-提款批次信息* @return* @throws ParseException*/
public static FinancTransWrInterpayRo getInterpayDetail( String startTime, int phase,FinancTransWrInfoBo transWrInfoBo , FinancTransWrListBo bo ) throws ParseException {FinancTransWrInterpayRo interpayRo = new FinancTransWrInterpayRo();BigDecimal hkAmount = bo.getWithdrawalAmount();//本金BigDecimal ll= transWrInfoBo.getActRate().divide(new BigDecimal(100)); //利率int jxfs= Integer.parseInt(transWrInfoBo.getRateMethod().split("/")[1]); //计息天数是360,365//需要重新修改结束时间String endTime = bo.getWithdrawalEndDate(); //按规则生成时间与end取最小值String type = transWrInfoBo.getRatePayFreq();if( "PAM".equals( type)){//到期日支付endTime = bo.getWithdrawalEndDate();}else if("M".equals(type) ){//按月支付String endTmp = getNextMonthDate( bo.getWithdrawalStartDate(), phase);if( DateUtils.stringToDate(endTime,"yyyy-MM-dd").getTime() > DateUtils.stringToDate(endTmp,"yyyy-MM-dd").getTime() ){endTime = endTmp;}}else if( "MTHLY10".equals( type)) {// 每月10日String startTmp  =  bo.getWithdrawalStartDate();startTmp =startTmp.substring(0,  startTmp.lastIndexOf("-"))+"-10";String endTmp = getNextMonthDate(startTmp, phase);if( DateUtils.stringToDate(endTime,"yyyy-MM-dd").getTime() > DateUtils.stringToDate(endTmp,"yyyy-MM-dd").getTime() ){endTime = endTmp;}}else if( "MTHLY21".equals(type)){//MTHLY21 每月21日String startTmp  =  bo.getWithdrawalStartDate();startTmp =startTmp.substring(0,  startTmp.lastIndexOf("-"))+"-21";String endTmp = getNextMonthDate(startTmp, phase);if( DateUtils.stringToDate(endTime,"yyyy-MM-dd").getTime() > DateUtils.stringToDate(endTmp,"yyyy-MM-dd").getTime() ){endTime = endTmp;}}else if("Q21".equals(type)){//Q21 每季末月21日String startTmp  =  bo.getWithdrawalStartDate();startTmp =startTmp.substring(0,  startTmp.lastIndexOf("-"))+"-21";String endTmp = getNextQuarter(startTmp, phase);if( DateUtils.stringToDate(endTime,"yyyy-MM-dd").getTime() > DateUtils.stringToDate(endTmp,"yyyy-MM-dd").getTime() ){endTime = endTmp;}}else if( "A".equals( type)){//每年String endTmp = getNextMonthDate( bo.getWithdrawalStartDate(), phase*12);if( DateUtils.stringToDate(endTime,"yyyy-MM-dd").getTime() > DateUtils.stringToDate(endTmp,"yyyy-MM-dd").getTime() ){endTime = endTmp;}} else{return null;}int dayc=daysBetween(startTime,endTime);BigDecimal rll = new BigDecimal(String.valueOf(ll)).divide(BigDecimal.valueOf(jxfs),10,BigDecimal.ROUND_HALF_UP);BigDecimal lxje = hkAmount.multiply(rll).multiply(BigDecimal.valueOf(dayc));interpayRo.setWithdrawalPc( bo.getWithdrawalPc());interpayRo.setPlanInterpayDate( endTime);interpayRo.setStartDate( startTime);interpayRo.setEndDate( endTime );interpayRo.setAddFlag("1");interpayRo.setDays( dayc);interpayRo.setRateMethod( transWrInfoBo.getRateMethod() );interpayRo.setAnnualizedRate( transWrInfoBo.getActRate() );interpayRo.setPrincipal( hkAmount);interpayRo.setInterAmount( lxje.setScale(2, RoundingMode.HALF_UP));return interpayRo;
}/*** 获取付息列表* @param result* @param pchList*/
public static  void getInterpayList( WithdrawalInfoRo result , FinancTransWrInfoBo transWrInfoBo , List<FinancTransWrListBo> pchList ) throws ParseException {List<FinancTransWrInterpayRo> interpayRos = result.getTransWrInterpays();if( interpayRos == null ){interpayRos = new ArrayList<>();}String type = transWrInfoBo.getRatePayFreq();for( FinancTransWrListBo bo : pchList){boolean b = true;String startTime = bo.getWithdrawalStartDate();int phase = 0;//第几期if( "MTHLY10".equals( type)) {// 每月10日-在10号最近还款日期应该是当月int dayTmp = Integer.parseInt((bo.getWithdrawalStartDate().split("-"))[2]);if (dayTmp < 10) { //加入小于10号在当月开始第一笔还款phase = -1;}}else if( "MTHLY21".equals( type)){// 每月21日-在21号前最近还款日期应该是当月int dayTmp = Integer.parseInt((bo.getWithdrawalStartDate().split("-"))[2]);if (dayTmp < 21) { //加入小于10号在当月开始第一笔还款phase = -1;}}else if( "Q21".equals( type)){//当季度月份21一号前最近还款日是当月 期数为0开始Calendar calendar = Calendar.getInstance();calendar.setTime(DateUtils.stringToDate( bo.getWithdrawalStartDate(),"yyyy-MM-dd" ));if( ( calendar.get(Calendar.MONTH)+1)  %3==0 ){//判断当前时间是季度月int dayTmp = Integer.parseInt((bo.getWithdrawalStartDate().split("-"))[2]);if (dayTmp < 21) { //加入小于10号在当月开始第一笔还款phase = -1;}}}while ( b ){FinancTransWrInterpayRo ro= getInterpayDetail( startTime ,++phase ,  transWrInfoBo , bo);if( ro ==null ){break;}b = DateUtils.stringToDate(bo.getWithdrawalEndDate(),"yyyy-MM-dd").getTime() > DateUtils.stringToDate(ro.getEndDate(),"yyyy-MM-dd").getTime();startTime = ro.getEndDate();interpayRos.add( ro);}}result.setTransWrInterpays( interpayRos);
}
/*** 测试案例:M -  1、开始日期每月都存在    2、开始日期部分月份不存在 例如31号*         MTHLY10/MTHLY21 案例:1、开始时间在还款日之前日期 <10 2、开始时间当天还款日 =10 3、开始时间在还款日期之后*          Q21 : 1、Q月份前 2、Q当月(还款日期前,当天,后)*          A:一年的,跨年的* @param bo* @return*/
public static  Result<WithdrawalInfoRo> getRepayPlanListNew ( WithdrawalInfoBo bo ){try {WithdrawalInfoRo withdrawalInfoRo = new WithdrawalInfoRo();getRepayList( withdrawalInfoRo,bo.getTransWrLists());getInterpayList( withdrawalInfoRo,bo.getTransWrInfo(),bo.getTransWrLists() );return Result.success(withdrawalInfoRo);}catch (Exception ex ){ex.printStackTrace();return Result.failed("还本付息计划生成失败");}
}

按提款计划生成还本付息计划相关推荐

  1. 《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一1.1 生成执行计划

    1.1 生成执行计划 在Oracle中,任何一条语句在解析过程中都会生成一个唯一的数值标识,即SQL_ID.而同一条语句,在解析过程中,可能会因为执行环境的改变(例如某些优化参数被改变)而生成多个版本 ...

  2. 谋而后动:解读数仓计划生成中行数估算和路径生成的奥秘

    摘要: 孙子兵法云:"谋定而后动,知止而有得",做任何事一定要进行谋划部署,做好准备,这样才能利于这件事的成功,切不可莽撞而行.同样,GaussDB(DWS)执行查询语句也会按照预 ...

  3. 30天敏捷生活(7):生成行动计划

    目标制定可以促进自己的行动,但你需要为每个目标都制定一个执行计划吗?不需要.太多计划会导致麻木,以至于计划很难落地,所以如果你的目标很小(例如我每周写X篇blog或者一周锻炼X次身体),小到你只需要2 ...

  4. sql server2008 批量删除发生:查询处理器用尽了内部资源,无法生成查询计划。这种情况很少出现,只有在查询极其复杂或引用了大量表或分区时才会出现。请简化查询

    昨晚跑了一个程序:批量删除一些数据,我sql语句写的有点烂,在where条件时候用的是   IN .所以最后发生异常:查询处理器用尽了内部资源,无法生成查询计划.这种情况很少出现,只有在查询极其复杂或 ...

  5. freeswitch实战八(动态生成拨号计划)

    动态生成拨号计划加动态录音设置 模块创建,动态dialplan的生成配置 1. 安装mod_xml_curl模块1. 在源码目录下:2. make mod_xml_curl && ma ...

  6. 生词提取方法,学以致用(用于生成学习计划)

    为了能够更加便捷的吸收英文文章的养分,从下周开始,计划边读文章,边学习.在拿到一片英文材料后,首先识别其中已经知道的单词,然后识别自己不会的单词.根据不会的单词制定单词学习计划.单词掌握以后,学习内容 ...

  7. python 打卡程序_python获取微信企业号打卡数据并生成windows计划任务

    由于公司的系统用的是Java版本,开通了企业号打卡之后又没有预算让供应商做数据对接,所以只能自己捣鼓这个,以下是个人设置的一些内容,仅供大家参考 安装python python的安装,这里就不详细写了 ...

  8. 利用python获取微信企业号打卡数据,并生成windows计划任务

    利用python获取微信企业号打卡数据,并生成windows计划任务 安装python 安装第三方库 写主程序 设置Windows计划任务 由于公司的系统用的是Java版本,开通了企业号打卡之后又没有 ...

  9. 【办公类-22-04】周计划系列(4)-生成“周计划”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)

    代码相当复杂,操作很繁琐,自己都要研究半天T_T 文件夹展示 01提取提取新表的已有内容(提取大8班.大7班的新版本里面的额内容) (需要里面的一些反思,用来占位) 这里有一份根据新模板用Python ...

最新文章

  1. bootstrap轮播图自动播放响应式箭头居中
  2. SpringBoot同时集成Redis和Guava作为缓存组件--进一步分析代码
  3. Android中Context详解
  4. KVM 虚拟化技术以及 KVM 和云计算的关系
  5. 脚本运行显示服务器超时,java执行shell脚本超时
  6. android 自定义loading,android_自定义Loading框
  7. lora无线模块基于LoRaWAN网关技术在国家物联网应用
  8. 如何运行python代码
  9. 遗传算法中的转盘算法
  10. java 模拟post上传文件_JAVA模拟HTTP post请求上传文件
  11. java merge_java – OptimisticLockException当使用JPA merge()
  12. 2020软件设计师考试大纲
  13. 在线购物系统 问题描述、词汇表、领域类图
  14. 【转发】相似性度量学习及其在计算机视觉中的应用
  15. Stm32中英文手册官网免费
  16. linux中使用U盘拷贝
  17. SpringBoot系列:Spring Boot集成定时任务Quartz,java百度云短信发送
  18. 使用ConfigFilter
  19. C语言中printf打印形式(%02X, %2X, %-2X, %.nf, %m.nf, %e, %m.ne, %2d, %-2d, %02d, %.2d)
  20. 模糊算法增强图片对比度

热门文章

  1. python告诉你ti8 dota2英雄bp 1
  2. Java_Day7接昨天ArrayList,String字符串,static关键字
  3. java如何解析nmon数据,Nmon结果文件分析
  4. 使用 Fiddler Everywhere 进行抓包
  5. VirtualBox虚拟机网络配置
  6. u盘固定盘符_高手固定U盘盘符有绝招
  7. word中字体大小(pt)与网页中css设置font-size时用的px大小对应关系
  8. 图虫网、人人字幕Scrapy爬虫实战分享 附源码
  9. 短视频剪辑素材在哪里找?
  10. 数据猿专栏专家张涵诚:从技术到生态构建,云计算棋局越来越大,该如何成功落地?...