Files
2024-09-30 14:08:38 +08:00

645 lines
17 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="tools">
<u-subsection :list="list" :current="current" @change="sectionChange"></u-subsection>
<view v-show="current == 0">
<u-cell-group>
<u-cell-item @click="changeType" title="选择计算方式" :value="typeMap[type]"></u-cell-item>
<u-cell-item title="商业贷款金额(万元)" :arrow="false">
<u-input v-model="amount" input-align="right" placeholder="请输入商业贷款金额" />
</u-cell-item>
<u-cell-item @click="showPeriod = true" title="贷款期限" :value="periodMap[period]"></u-cell-item>
<u-cell-item @click="showRate = true" title="商业贷款年利率" :value="(rate * 100).toFixed(3) + '%'">
</u-cell-item>
</u-cell-group>
</view>
<view v-show="current == 1">
<u-cell-group>
<u-cell-item @click="changeType" title="选择计算方式" :value="typeMap[type]"></u-cell-item>
<u-cell-item title="公积金贷款金额(万元)" :arrow="false">
<u-input v-model="gjjAmount" input-align="right" placeholder="请输入商业贷款金额" />
</u-cell-item>
<u-cell-item @click="showPeriod = true" title="贷款期限" :value="periodMap[period]"></u-cell-item>
<u-cell-item @click="showGjjRate = true" title="公积金贷款年利率" :value="(gjjRate * 100).toFixed(3) + '%'">
</u-cell-item>
</u-cell-group>
</view>
<view v-show="current == 2">
<u-cell-group>
<u-cell-item @click="changeType" title="选择计算方式" :value="typeMap[type]"></u-cell-item>
<u-cell-item @click="showPeriod = true" title="贷款期限" :value="periodMap[period]"></u-cell-item>
<u-cell-item title="商业贷款金额(万元)" :arrow="false">
<u-input v-model="amount" input-align="right" placeholder="请输入商业贷款金额" />
</u-cell-item>
<u-cell-item @click="showRate = true" title="商业贷款年利率" :value="(rate * 100).toFixed(3) + '%'">
</u-cell-item>
<u-cell-item title="公积金贷款金额(万元)" :arrow="false">
<u-input v-model="gjjAmount" input-align="right" placeholder="请输入公积金贷款金额" />
</u-cell-item>
<u-cell-item @click="showGjjRate = true" title="公积金贷款年利率" :value="(gjjRate * 100).toFixed(3) + '%'">
</u-cell-item>
</u-cell-group>
</view>
<button class="calc" @tap="calc()">开始计算</button>
<view class="reslut">
<view class="tabs">
<view class="tab" @tap="changeResultType(0)" :class="{active: type == '0'}">等额本息</view>
<view class="tab" @tap="changeResultType(1)" :class="{active: type == '1'}">等额本金</view>
</view>
<view class="content">
<view class="top">
<view class="title">每月月供参考(元)</view>
<view class="month">{{reslut.monthAmount}}</view>
</view>
<view class="bottom">
<view class="col">
<view class="title">还款总额(万元)</view>
<view class="total">{{reslut.totalReturnAmount}}</view>
</view>
<view class="col">
<view class="title">贷款总额(万元)</view>
<view class="total">{{reslut.totalAmount}}</view>
</view>
<view class="col">
<view class="title">支付利息(万元)</view>
<view class="total">{{reslut.rateAmount}}</view>
</view>
</view>
<view class="btns">
<button class="btn" @tap="reset">重新计算</button>
<button class="btn" @tap="resultDetail">还款数据明细</button>
</view>
<view class="tips">
<text v-show="type == '0'" class="title">等额本息:每月还款额固定,其中本金部分逐月递增、利息部分逐月递减</text>
<text v-show="type == '1'" class="title">等额本金:每月还款额递减,其中本金部分固定、利息部分逐月递减</text>
</view>
</view>
</view>
<u-select v-model="showType" :list="typeList" @confirm="typeConfirm"></u-select>
<u-select v-model="showPeriod" :list="periodList" @confirm="periodConfirm"></u-select>
<u-select v-model="showRate" :list="rateList" @confirm="rateConfirm"></u-select>
<u-select v-model="showGjjRate" :list="gjjRateList" @confirm="gjjRateConfirm"></u-select>
<u-select v-model="showResultList" :list="listAmount"></u-select>
<u-modal v-model="showCustomeRate" @confirm="customeConfirm">
<view class="slot-content">
<view style="padding: 0 30upx;">
<u-input v-model="customeRate" input-align="center" placeholder="请输入贷款利率(%)"></u-input>
</view>
</view>
</u-modal>
<u-toast ref="uToast" />
</view>
</template>
<script>
var app = getApp();
export default {
data() {
return {
colors: '',
list: [{
name: '商业贷款'
},
{
name: '公积金贷款'
},
{
name: '组合贷款'
}
],
current: 0,
showType: false,
typeList: [{
value: '0',
label: '等额本息'
},
{
value: '1',
label: '等额本金'
}
],
typeMap: {
"0": "等额本息",
"1": "等额本金"
},
showCustomeRate: false,
showPeriod: false,
periodMap: {},
periodList: [],
showRate: false,
rateList: [{
value: '0.04165',
label: '基准利率8.5折(4.165%)'
},
{
value: '0.0441',
label: '基准利率9折(4.41%)'
},
{
value: '0.04655',
label: '基准利率9.5折(4.655%)'
},
{
value: '0.049',
label: '基准利率(4.9%)'
},
{
value: '0.0539',
label: '基准利率1.1倍(5.39%)'
},
{
value: '0.0588',
label: '基准利率1.2倍(5.88%)'
},
{
value: '0',
label: '自定义'
}
],
showGjjRate: false,
gjjRateList: [{
value: '0.0325',
label: '基准利率(3.25%)'
},
{
value: '0.03575',
label: '基准利率1.1倍(3.575%)'
},
{
value: '0.039',
label: '基准利率1.2倍(3.9%)'
},
{
value: '0',
label: '自定义'
}
],
type: "0",
amount: undefined,
gjjAmount: undefined,
period: 20,
rate: "0.049",
gjjRate: "0.0325",
customeRate: undefined,
customeType: undefined,
showResultList: false,
reslut: {
monthAmount: 0,
totalAmount: 0,
totalReturnAmount: 0,
rateAmount: 0,
},
groupResult: {},
listAmount: [],
resultType: 0
};
},
components: {},
props: {},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function(options) {
let periodList = [];
let periodMap = {};
for (var i = 1; i <= 30; i++) {
let label = i + '年' + ' (' + i * 12 + '期)';
periodList.push({
value: i,
label: label
});
periodMap[i] = label;
}
let rateMap = {};
for (var i = 0; i < this.rateList.length; i++) {
let item = this.rateList[i];
rateMap[item.value] = item.label;
}
this.setData({
colors: app.globalData.newColor,
periodList: periodList,
periodMap: periodMap,
rateMap: rateMap
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function() {},
/**
* 生命周期函数--监听页面显示
*/
onShow: function() {},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function() {},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function() {},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function() {},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function() {},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function() {},
methods: {
changeResultType(type){
this.setData({
type: type,
reslut: type == 0 ? this.groupResult["bx"] : this.groupResult["bj"]
});
},
resultDetail(){
if(this.type == 0){
this.$refs.uToast.show({
title: '等额本息还款固定',
type: 'warning'
})
return;
}
this.setData({
showResultList: true
});
},
calc(){
if(this.current == 2){
this.calcGroup();
} else {
this.calcSimple();
}
},
calcSimple() {
//商业贷款、公积金贷款
let lilv = this.current == 0 ? this.rate : this.gjjRate; //得到利率
//贷款总额
let daikuan_total = this.current == 0 ? this.amount * 10000 : this.gjjAmount * 10000;
//还款周期
let month = this.period * 12;
let groupResult = {};
let listAmount = [];
//1.本金还款
if(true){
//月还款
let totalReturnAmount = 0;
let firstAmount = 0;
for (let j = 0; j < month; j++) {
//调用函数计算: 本金月还款额
let huankuan = this.getMonthMoney2(lilv, daikuan_total, month, j);
totalReturnAmount += huankuan;
huankuan = Math.round(huankuan * 100) / 100;
if(j == 0){
firstAmount = huankuan;
}
listAmount.push({"value": (j + 1) + "月", "label": '第' + (j + 1) + "月 还 " + huankuan + '元'})
}
//还款总额
let total = Math.round(totalReturnAmount * 100) / 100;
//支付利息款
let lx = Math.round((totalReturnAmount - daikuan_total) * 100) / 100;
let reslut = {
totalAmount: (daikuan_total / 10000).toFixed(2),
monthAmount: firstAmount.toFixed(2),
totalReturnAmount: (total / 10000).toFixed(2),
rateAmount: (lx / 10000).toFixed(2),
}
groupResult["bj"] = reslut;
}
if(true){
//2.本息还款
//月均还款
let monthAmount = this.getMonthMoney1(lilv, daikuan_total, month); //调用函数计算
monthAmount = Math.round(monthAmount * 100) / 100;
//还款总额
let total = monthAmount * month ;
//支付利息款
let lx_txt = Math.round((total - daikuan_total) * 100) / 100;
total = Math.round(total * 100) / 100;
let reslut = {
totalAmount: (daikuan_total / 10000).toFixed(2),
monthAmount: monthAmount.toFixed(2),
totalReturnAmount: (total / 10000).toFixed(2),
rateAmount: (lx_txt / 10000).toFixed(2),
}
groupResult["bx"] = reslut;
}
this.setData({
groupResult: groupResult,
listAmount: listAmount,
reslut: this.type == '0' ? groupResult["bx"]: groupResult["bj"]
})
},
calcGroup(){
//贷款总额
let total_sy = this.amount * 10000;
let total_gjj = this.gjjAmount * 10000;
let daikuan_total = total_sy + total_gjj;
//月还款
let lilv_sd = this.rate;//得到商贷利率
let lilv_gjj = this.gjjRate;//得到公积金利率
let groupResult = {};
//1.本金还款
//月还款
let all_total2 = 0;
let month_money2 = "";
let month = this.period * 12;
let firstAmount = 0;
let listAmount = [];
for(let j = 0; j < month; j++){
//调用函数计算: 本金月还款额
let huankuan = this.getMonthMoney2(lilv_sd, total_sy, month, j) + this.getMonthMoney2(lilv_gjj, total_gjj, month, j);
all_total2 += huankuan;
huankuan = Math.round(huankuan * 100) / 100;
//month_money2 += (j + 1) + "月," + huankuan + "(元)\n";
if(j == 0){
firstAmount = huankuan;
}
listAmount.push({"value": (j + 1) + "月", "label": '第' + (j + 1) + "月 还 " + huankuan + '元'})
}
//还款总额
var all_total2_txt = Math.round(all_total2 * 100) / 100;
//支付利息款
var accrual2 = Math.round((all_total2 - daikuan_total) * 100) / 100;
let reslut = {
totalAmount: (daikuan_total / 10000).toFixed(2),
monthAmount: firstAmount.toFixed(2),
totalReturnAmount: (all_total2_txt / 10000).toFixed(2),
rateAmount: (accrual2 / 10000).toFixed(2),
}
groupResult["bj"] = reslut;
//2.本息还款
//月均还款
var month_money1 = this.getMonthMoney1(lilv_sd, total_sy, month) + this.getMonthMoney1(lilv_gjj, total_gjj, month);//调用函数计算
var month_money1_txt = Math.round(month_money1 * 100) / 100;
//还款总额
var all_total1 = month_money1 * month;
var all_total1_txt = Math.round(all_total1 * 100) / 100;
//支付利息款
var accrual1_txt = Math.round((all_total1 - daikuan_total) * 100) / 100;
let reslut1 = {
totalAmount: (daikuan_total / 10000).toFixed(2),
monthAmount: month_money1_txt.toFixed(2),
totalReturnAmount: (all_total1_txt / 10000).toFixed(2),
rateAmount: (accrual1_txt / 10000).toFixed(2),
}
groupResult["bx"] = reslut1;
this.setData({
groupResult: groupResult,
listAmount: listAmount,
reslut: this.type == '0' ? groupResult["bx"]: groupResult["bj"]
})
},
//本息还款的月还款额(参数: 年利率/贷款总额/贷款总月份)
getMonthMoney1(lilv, total, month){
var lilv_month = lilv / 12;//月利率
return total * lilv_month * Math.pow(1 + lilv_month, month) / ( Math.pow(1 + lilv_month, month) -1 );
},
//本金还款的月还款额(参数: 年利率 / 贷款总额 / 贷款总月份 / 贷款当前月0~length-1)
getMonthMoney2(lilv, total, month, cur_month){
var lilv_month = lilv / 12;//月利率
var benjin_money = total / month;
return (total - benjin_money * cur_month) * lilv_month + benjin_money;
},
sectionChange(index) {
this.current = index;
this.reset();
},
reset(){
this.setData({
type: "0",
amount: undefined,
gjjAmount: undefined,
period: 20,
rate: "0.049",
gjjRate: "0.0325",
customeRate: undefined,
customeType: undefined,
reslut: {
monthAmount: 0,
totalAmount: 0,
totalReturnAmount: 0,
rateAmount: 0,
},
groupResult: {}
})
},
changeType() {
this.setData({
showType: true
})
},
typeConfirm(e) {
this.setData({
type: e[0].value
})
},
periodConfirm(e) {
this.setData({
period: e[0].value
})
},
rateConfirm(e) {
if (e[0].value == "0") {
this.setData({
showCustomeRate: true,
customeType: 0
})
return
}
this.setData({
rate: e[0].value
})
},
gjjRateConfirm(e) {
if (e[0].value == "0") {
this.setData({
showCustomeRate: true,
customeType: 1
})
return
}
this.setData({
gjjRate: e[0].value
})
},
customeConfirm() {
if (this.customeType == 0) {
this.setData({
rate: Number(this.customeRate) / 100
})
} else {
this.setData({
gjjRate: Number(this.customeRate) / 100
})
}
},
}
};
</script>
<style lang="scss" scoped>
page {
background-color: #F5F5FA;
}
.reslut {
margin: 20upx 20upx;
box-shadow: 0 0.07rem 0.25rem #eff0f3;
-webkit-box-shadow: 0 0.07rem 0.25rem #eff0f3;
-moz-box-shadow: 0 .07rem .25rem #EFF0F3;
-o-box-shodow: 0 .07rem .25rem #EFF0F3;
margin-bottom: .6rem;
border-radius: .04rem;
border: 1px solid #E6E9F0;
}
.reslut .tabs {
height: 80upx;
line-height: 80upx;
width: 100%;
display: flex;
}
.reslut .tabs .tab{
width: 50%;
text-align: center;
background-color: #F7F8FA;
}
.reslut .tabs .active{
background-color: #ffffff;
}
.reslut .content{
padding: 30upx 30upx;
background-color: #ffffff;
}
.reslut .content .title{
color: #868E9E;
font-size: 26upx;
padding-bottom: 10upx;
}
.reslut .content .month{
font-size: 40upx;
font-weight: bold;
}
.reslut .content .bottom{
padding: 20upx 0;
display: flex;
justify-content: space-between;
}
.reslut .content .bottom .total{
font-size: 30upx;
}
.reslut .content .btns{
padding: 20upx 0;
display: flex;
justify-content: space-between;
background-color: #ffffff;
}
.reslut .content .btns .btn{
width: 300upx;
border-radius: 100upx;
color: #394259;
border: 1upx solid #D1D1D1;
background-color: #fff;
font-size: 28upx;
}
.reslut .content .tips{
padding: 20upx 0;
}
.calc{
background-color: #0076FF;
color: #ffffff;
font-size: 30upx;
padding: 6upx 0;
}
.t_input {
padding: 20upx 4%;
background-color: #fff;
display: flex;
align-items: center;
justify-content: space-between;
}
.t_input .title {
height: 80upx;
line-height: 80upx;
color: #333;
font-weight: bold;
width: 120upx;
}
.t_input .inputs {
color: #333;
font-size: 32upx;
}
.inputs input {
height: 80upx;
line-height: 80upx;
width: 100%;
display: block;
}
.all_btn {
font-size: 24upx;
font-family: Source Han Sans CN;
font-weight: 400;
width: 150upx;
}
.jilu {
height: 60upx;
line-height: 60upx;
padding: 0 4%;
font-size: 28upx;
color: #999;
font-family: Source Han Sans CN;
font-weight: 400;
margin-top: 10upx;
}
.addclerk {
width: 80%;
height: 82upx;
line-height: 82upx;
border-radius: 15upx;
font-size: 32upx;
font-family: Source Han Sans CN;
font-weight: 500;
color: rgba(255, 255, 255, 1);
text-align: center;
position: fixed;
bottom: 30upx;
left: 50%;
transform: translateX(-50%);
background-color: pink;
}
.addclerk:active {
opacity: 0.8;
}
</style>
<style>
page {
background-color: #F5F5FA;
}
</style>