calcute.js 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. var calcute = {
  2. //商贷-公积金贷款统一函数
  3. singleDk: function(type, num, year, lilv) {
  4. var _this = this;
  5. // type:1等额本息 2等额本金,num 贷款金额 year贷款年限,lilv:贷款基准利率
  6. if (type == 1) {
  7. return _this.benxi(type, num, year, lilv)
  8. } else if (type == 2) {
  9. return _this.benjin(type, num, year, lilv)
  10. }
  11. },
  12. //组合贷款计算
  13. zuhe: function(type, sdnum, gjjnum, sdyear, gjjyear, sdlilv, gjjlilv) {
  14. var _this = this,
  15. year = sdyear > gjjyear ? sdyear : gjjyear;
  16. if (type == 1) {
  17. var sdObj = _this.benxi(type, sdnum, sdyear, sdlilv);
  18. var gjjObj = _this.benxi(type, gjjnum, gjjyear, gjjlilv);
  19. if (sdObj.monthdataArray.length > gjjObj.monthdataArray.length) {
  20. var mergemonthdataArray = sdObj.monthdataArray.map(function(item, index) {
  21. if (index < gjjObj.monthdataArray.length) {
  22. return {
  23. monthName: item.monthName,
  24. yuelixi: item.yuelixi + gjjObj.monthdataArray[index].yuelixi,
  25. yuebenjin: item.yuebenjin + gjjObj.monthdataArray[index].yuebenjin,
  26. leftFund: item.leftFund + gjjObj.monthdataArray[index].leftFund
  27. }
  28. } else {
  29. return {
  30. monthName: item.monthName,
  31. yuelixi: item.yuelixi,
  32. yuebenjin: item.yuebenjin,
  33. leftFund: item.leftFund
  34. }
  35. }
  36. })
  37. } else {
  38. var mergemonthdataArray = gjjObj.monthdataArray.map(function(item, index) {
  39. if (index < sdObj.monthdataArray.length) {
  40. return {
  41. monthName: item.monthName,
  42. yuelixi: item.yuelixi + sdObj.monthdataArray[index].yuelixi,
  43. yuebenjin: item.yuebenjin + sdObj.monthdataArray[index].yuebenjin,
  44. leftFund: item.leftFund + sdObj.monthdataArray[index].leftFund
  45. }
  46. } else {
  47. return {
  48. monthName: item.monthName,
  49. yuelixi: item.yuelixi,
  50. yuebenjin: item.yuebenjin,
  51. leftFund: item.leftFund
  52. }
  53. }
  54. })
  55. }
  56. return {
  57. yuegong: sdObj.yuegong + gjjObj.yuegong,
  58. totalLixi: sdObj.totalLixi + gjjObj.totalLixi,
  59. totalPrice: sdObj.totalPrice + gjjObj.totalPrice,
  60. monthdataArray: mergemonthdataArray,
  61. totalDknum: parseFloat(sdObj.totalDknum) + parseFloat(gjjObj.totalDknum),
  62. year: year
  63. }
  64. } else if (type == 2) {
  65. var sdObj = _this.benjin(type, sdnum, sdyear, sdlilv);
  66. var gjjObj = _this.benjin(type, gjjnum, gjjyear, gjjlilv);
  67. if (sdObj.monthdataArray.length > gjjObj.monthdataArray.length) {
  68. var mergemonthdataArray = sdObj.monthdataArray.map(function(item, index) {
  69. if (index < gjjObj.monthdataArray.length) {
  70. return {
  71. monthName: item.monthName,
  72. yuelixi: item.yuelixi + gjjObj.monthdataArray[index].yuelixi,
  73. yuebenjin: item.yuebenjin + gjjObj.monthdataArray[index].yuebenjin,
  74. leftFund: item.leftFund + gjjObj.monthdataArray[index].leftFund
  75. }
  76. } else {
  77. return {
  78. monthName: item.monthName,
  79. yuelixi: item.yuelixi,
  80. yuebenjin: item.yuebenjin,
  81. leftFund: item.leftFund
  82. }
  83. }
  84. })
  85. } else {
  86. var mergemonthdataArray = gjjObj.monthdataArray.map(function(item, index) {
  87. if (index < sdObj.monthdataArray.length) {
  88. return {
  89. monthName: item.monthName,
  90. yuelixi: item.yuelixi + sdObj.monthdataArray[index].yuelixi,
  91. yuebenjin: item.yuebenjin + sdObj.monthdataArray[index].yuebenjin,
  92. leftFund: item.leftFund + sdObj.monthdataArray[index].leftFund
  93. }
  94. } else {
  95. return {
  96. monthName: item.monthName,
  97. yuelixi: item.yuelixi,
  98. yuebenjin: item.yuebenjin,
  99. leftFund: item.leftFund
  100. }
  101. }
  102. })
  103. }
  104. return {
  105. yuegong: sdObj.yuegong + gjjObj.yuegong,
  106. totalLixi: sdObj.totalLixi + gjjObj.totalLixi,
  107. totalPrice: sdObj.totalPrice + gjjObj.totalPrice,
  108. yuegongdijian: sdObj.yuegongdijian + gjjObj.yuegongdijian,
  109. totalDknum: parseFloat(sdObj.totalDknum) + parseFloat(gjjObj.totalDknum),
  110. year: year,
  111. monthdataArray: mergemonthdataArray
  112. }
  113. }
  114. },
  115. //等额本息计算
  116. benxi: function(type, num, year, lilv) {
  117. //每月月供额=〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕
  118. var month = parseInt(year) * 12,
  119. monthlilv = parseFloat(lilv) / 12,
  120. dknum = parseFloat(num) * 10000;
  121. //每月月供
  122. var yuegong = (dknum * monthlilv * Math.pow((1 + monthlilv), month)) / (Math.pow((1 + monthlilv), month) - 1);
  123. //总利息=还款月数×每月月供额-贷款本金
  124. var totalLixi = month * yuegong - dknum;
  125. //还款总额 总利息+贷款本金
  126. var totalPrice = totalLixi + dknum,
  127. leftFund = totalLixi + dknum;
  128. //循环月份
  129. var monthdataArray = [],
  130. nowmonth = new Date().getMonth(),
  131. realmonth = 0;
  132. for (var i = 1; i <= month; i++) {
  133. realmonth = nowmonth + i;
  134. var yearlist = Math.floor(i / 12);
  135. realmonth = realmonth - 12 * yearlist;
  136. if (realmonth > 12) {
  137. realmonth = realmonth - 12
  138. }
  139. //console.log(realmonth)
  140. //每月应还利息=贷款本金×月利率×〔(1+月利率)^还款月数-(1+月利率)^(还款月序号-1)〕÷〔(1+月利率)^还款月数-1〕
  141. var yuelixi = dknum * monthlilv * (Math.pow((1 + monthlilv), month) - Math.pow((1 + monthlilv), i - 1)) / (Math.pow((1 + monthlilv), month) - 1);
  142. //每月应还本金=贷款本金×月利率×(1+月利率)^(还款月序号-1)÷〔(1+月利率)^还款月数-1〕
  143. var yuebenjin = dknum * monthlilv * Math.pow((1 + monthlilv), i - 1) / (Math.pow((1 + monthlilv), month) - 1);
  144. leftFund = leftFund - (yuelixi + yuebenjin);
  145. if (leftFund < 0) {
  146. leftFund = 0
  147. }
  148. monthdataArray[i - 1] = {
  149. monthName: realmonth + "月",
  150. yuelixi: yuelixi,
  151. yuebenjin: yuebenjin,
  152. //剩余还款
  153. leftFund: leftFund
  154. }
  155. }
  156. return {
  157. yuegong: yuegong,
  158. totalLixi: totalLixi,
  159. totalPrice: totalPrice,
  160. monthdataArray: monthdataArray,
  161. totalDknum: num,
  162. year: year
  163. };
  164. },
  165. //等额本金计算
  166. benjin: function(type, num, year, lilv) {
  167. var month = parseInt(year) * 12,
  168. monthlilv = parseFloat(lilv) / 12,
  169. dknum = parseFloat(num) * 10000,
  170. yhbenjin = 0; //首月还款已还本金金额是0
  171. //每月应还本金=贷款本金÷还款月数
  172. var everymonthyh = dknum / month
  173. //每月月供额=(贷款本金÷还款月数)+(贷款本金-已归还本金累计额)×月利率
  174. var yuegong = everymonthyh + (dknum - yhbenjin) * monthlilv;
  175. //每月月供递减额=每月应还本金×月利率=贷款本金÷还款月数×月利率
  176. var yuegongdijian = everymonthyh * monthlilv;
  177. //总利息=〔(总贷款额÷还款月数+总贷款额×月利率)+总贷款额÷还款月数×(1+月利率)〕÷2×还款月数-总贷款额
  178. var totalLixi = ((everymonthyh + dknum * monthlilv) + dknum / month * (1 + monthlilv)) / 2 * month - dknum;
  179. //还款总额 总利息+贷款本金
  180. var totalPrice = totalLixi + dknum,
  181. leftFund = totalLixi + dknum;
  182. //循环月份
  183. var monthdataArray = [],
  184. nowmonth = new Date().getMonth(),
  185. realmonth = 0;
  186. for (var i = 1; i <= month; i++) {
  187. realmonth = nowmonth + i;
  188. var yearlist = Math.floor(i / 12);
  189. realmonth = realmonth - 12 * yearlist;
  190. if (realmonth > 12) {
  191. realmonth = realmonth - 12
  192. }
  193. yhbenjin = everymonthyh * (i - 1);
  194. var yuebenjin = everymonthyh + (dknum - yhbenjin) * monthlilv;
  195. //每月应还利息=剩余本金×月利率=(贷款本金-已归还本金累计额)×月利率
  196. var yuelixi = (dknum - yhbenjin) * monthlilv;
  197. leftFund = leftFund - yuebenjin;
  198. if (leftFund < 0) {
  199. leftFund = 0
  200. }
  201. monthdataArray[i - 1] = {
  202. monthName: realmonth + "月",
  203. yuelixi: yuelixi,
  204. //每月本金
  205. yuebenjin: everymonthyh,
  206. //剩余还款
  207. leftFund: leftFund
  208. }
  209. }
  210. return {
  211. yuegong: yuegong,
  212. totalLixi: totalLixi,
  213. totalPrice: totalPrice,
  214. yuegongdijian: yuegongdijian,
  215. monthdataArray: monthdataArray,
  216. totalDknum: num,
  217. year: year
  218. }
  219. }
  220. }
  221. module.exports = {
  222. calcute: calcute
  223. }