<template>
|
<div class="apply-info">
|
<h2 class="section-title">提前部分还款试算</h2>
|
<div class="title-input">
|
<div class="title-warp">
|
<div>
|
提前部分还款金额 <el-input style="width:220px;margin:0 10px;" @focus="formatMoney" @blur="checkMoney" @change="checkMoney" placeholder="请输入提前部分还款金额" v-model.trim="trialPartMoneyToPage"></el-input>
|
<div class="blancetips">
|
<span v-if="info.thisPrePrincipalBalance">
|
提前还本金:{{$utils.fMoney(info.thisPrePrincipalBalance)}}
|
提前还利息:{{$utils.fMoney(info.thisPreInterestBalance)}}
|
提前还款违约金:{{$utils.fMoney(info.interestBalanceA5)}}
|
</span>
|
</div>
|
</div>
|
<div>应还日期 <el-date-picker style="width:240px;margin-left:10px" value-format="yyyy-MM-dd" v-model="trialPartDateToPage" type="date" placeholder="应还日期"></el-date-picker></div>
|
</div>
|
<div>
|
<el-button type="primary" class="comm-button" @click="trialPartbtn">还款计划试算</el-button>
|
</div>
|
</div>
|
<CommTable
|
ref="repaymentApplyTable"
|
:loading="loading"
|
:list="records"
|
:header="tableHeader"
|
columnIndexInfo
|
v-bind="$attrs"
|
></CommTable>
|
|
<Dialog
|
v-model="isShowDialog"
|
icon="succ"
|
iconText="提交成功"
|
:buttons="[{text: '确定', type: 'primary'}]"
|
@handleClick="commitSuccess"
|
></Dialog>
|
|
<Dialog
|
v-model="isShowSubmit"
|
title="信息确认"
|
:buttons="[{text: '取消'},{text: '确定', type: 'primary'}]"
|
@handleClick="clickAgainEnter"
|
:contentText="contentText"
|
></Dialog>
|
</div>
|
</template>
|
<script>
|
// 还款申请信息
|
import { mapState, mapMutations } from 'vuex'
|
import CommForm from '@/components/CommForm'
|
import CommTable from '@/components/CommTable'
|
import Dialog from '@/components/Dialog'
|
import queryCodeValueList from '@/controller/queryCodeValueList'
|
import getAmountCodeRsp from '@/controller/getAmountCodeRsp'
|
|
import repaymentCommit from '@/controller/repaymentCommit'
|
import trialPart from '@/controller/trialPart'
|
|
export default {
|
components: {
|
CommForm,
|
CommTable,
|
Dialog
|
},
|
props: {
|
conf: {
|
type: Object,
|
default: () => ({})
|
}
|
},
|
data() {
|
return {
|
info: {},
|
transCode: '',
|
applyType: '',
|
query: {},
|
formList: [],
|
loading: false,
|
tableHeader: [],
|
formButtons: [
|
{ text: '重置', type: 'default' },
|
{ text: '搜索' },
|
{ text: '展开', type: 'fold' }
|
],
|
pageInfo: {
|
currentPage: 1,
|
pageSize: 10
|
},
|
total: 0,
|
records: [],
|
checkedRecords: [],
|
tableModel: null,
|
codeUrl: '',
|
trialPartDateToPage:'',
|
trialPartMoneyToPage:null,
|
detailModel: null,
|
model: null,
|
selectModel: null,
|
codeRspModel: null,
|
isShowDialog: false,
|
isShowSubmit: false,
|
contentText: '',
|
visible: false
|
}
|
},
|
created() {
|
this.init()
|
},
|
methods: {
|
init() {
|
// applyType = '01'
|
|
const { query } = this.$route
|
const { transCode, applyType } = query
|
this.query = query
|
this.transCode = transCode
|
this.applyType = applyType
|
this.selectModel = queryCodeValueList()
|
|
this.detailModel = trialPart()
|
this.model = repaymentCommit()
|
this.codeRspModel = getAmountCodeRsp()
|
this.tableModel = this.detailModel
|
this.tableHeader = this.detailModel.getTableList()
|
|
// this.getDetail()
|
// this.getList()
|
},
|
trialPartbtn(){
|
if(!this.trialPartMoneyToPage){
|
this.$message.error('请输入正确的金额!')
|
return
|
}
|
if(!this.trialPartDateToPage){
|
this.$message.error('请选择应还日期')
|
return
|
}
|
|
if (this.trxnbrArray.length === 0 && !this.trialPartDateToPage) {
|
this.$message.error('银行流水不能为空!')
|
return
|
}
|
this.getDetail('true')
|
},
|
formatMoney(){
|
this.trialPartMoneyToPage = this.toFixedMoney(this.trialPartMoneyToPage)
|
},
|
checkMoney(){
|
if(this.trialPartMoneyToPage){
|
var regNumber=/^(?!0+(?:\.0+)?$)(?:[1-9]\d{0,2}(?:,\d{3})+|\d+)(?:\.\d{1,2})?$/;
|
if(!regNumber.test(this.trialPartMoneyToPage)){
|
this.$message.error('请输入正确的金额!')
|
this.trialPartMoneyToPage = ''
|
return
|
}
|
var aa = Number(this.trialPartMoneyToPage)
|
if(typeof aa == 'number'){
|
this.trialPartMoneyToPage = this.$utils.fMoney(this.trialPartMoneyToPage)
|
}
|
}
|
},
|
insertStr(source, start, newStr) {
|
return source.slice(0, start) + newStr + source.slice(start)
|
},
|
// 去掉分隔符 最后转成数字 只保留小数点两位
|
toFixedMoney(value){
|
let result = null;
|
if(value){
|
value = value.toString()
|
if(typeof value === 'string'){
|
result = value.indexOf(',') > -1 ? value.replace(/,/gi,'') : value
|
result = Number(Number(result).toFixed(2))
|
}
|
if(typeof value === 'number'){
|
result = Number(value.toFixed(2))
|
}
|
}
|
return result
|
},
|
async getDetail(flg) {
|
const { query, detailModel,trialPartMoneyToPage,trialPartDateToPage } = this
|
const { serialNo, applyType, transSerialNo = '' } = query
|
let info = await detailModel.request({
|
repayment:this.toFixedMoney(trialPartMoneyToPage),
|
loanSerialno:serialNo,
|
trialDate:trialPartDateToPage
|
}).catch(res=>{
|
if(res.code=="ES0018"){
|
this.setSelectionChange(Math.random())
|
}
|
})
|
if(info){
|
this.setSelectionChange(true)
|
if(info && info.paymentScheduleRsp && flg == 'true'){
|
this.$message.success('试算结果返回成功!')
|
}
|
this.info = { ...info }
|
this.records = info.paymentScheduleRsp
|
}else{
|
this.info = {}
|
}
|
|
},
|
|
// 获取列表
|
async getList() {
|
this.loading = true
|
let { pageInfo, tableModel, query } = this
|
const { serialNo } = query
|
// 自动扣款挂起管理新增查询条件字段loanUpStatus
|
const res = await tableModel.request({
|
serialNo,
|
...pageInfo
|
})
|
this.loading = false
|
const { list = [], total } = res
|
this.records = list
|
this.total = parseInt(total)
|
},
|
// 表单按钮事件处理
|
submit() {
|
const {
|
query,
|
trxnbrArray,
|
conf,
|
claimTotal,
|
repayTotal,
|
} = this
|
const { edit } = conf
|
if (edit !== 'Y') {
|
return false
|
}
|
if(!this.trialPartMoneyToPage){
|
this.$message.error('请输入提前部分还款金额!')
|
return false
|
}
|
if (this.trialPartMoneyToPage) {
|
if (trxnbrArray.length === 0) {
|
this.$message('银行流水不能为空!')
|
return false
|
}
|
if (Number(repayTotal) > Number(claimTotal)) {
|
this.contentText = '选中流水可能并非客户还款资金,请再次确认!'
|
this.isShowSubmit = true
|
}
|
if (Number(repayTotal) + 10 < Number(claimTotal)) {
|
this.contentText = '选中流水可能并非客户还款资金,请再次确认!'
|
this.isShowSubmit = true
|
}
|
this.toSubmit()
|
} else {
|
this.$message.warning('当前页面存在必填项未录入或数据录入错误,请检查!')
|
}
|
},
|
|
clickAgainEnter(index) {
|
this.isShowSubmit = false
|
if (index === 1) {
|
this.toSubmit()
|
}
|
},
|
|
async toSubmit() {
|
const {
|
model,
|
query,
|
values,
|
trxnbrArray,
|
} = this
|
const { serialNo, applyType } = query
|
await model.request({
|
trxnbrArray,
|
loanNo: serialNo,
|
applyType,
|
amt: this.trialPartMoneyToPage.replace(/,/gi,''),
|
...values
|
})
|
// loading.close()
|
this.setTransferSearchOptions({})
|
// this.getDetail()
|
this.isShowDialog = true
|
},
|
getPayAmtTotal() {
|
const { checkedRecords } = this
|
const keys = [
|
'principalBalance',
|
'interestBalance',
|
'penaltyBalance',
|
'feeBalance'
|
]
|
const total = checkedRecords.reduce((pre, curr) => {
|
pre = pre + keys.reduce((subPre, key) => subPre + Number(curr[key]), 0)
|
return pre
|
}, 0)
|
const dateArray = checkedRecords.reduce((pre, curr) => {
|
pre.push(new Date(curr.payDate).getTime())
|
return pre
|
}, [])
|
this.maxDate = Math.max(...dateArray)
|
// console.log(maxDate, new Date().toLocaleDateString() )
|
this.repayTotal = total.toFixed(2)
|
this.setRepayTotal(this.repayTotal)
|
this.setMaxDate(this.maxDate)
|
return total.toFixed(2)
|
},
|
|
// 提交成功后返回原列表页
|
commitSuccess() {
|
this.isShowDialog = false
|
this.$router.go(-1)
|
},
|
...mapMutations(['setRepayTotal', 'setMaxDate','setTransferSearchOptions','setSelectionChange'])
|
},
|
computed: {
|
// 表单值信息
|
...mapState({
|
trxnbrArray: state => state.tabsModule.trxnbrArray,
|
trxnbrList:state=>state.tabsModule.trxnbrList,
|
claimTotal: state => state.tabsModule.claimTotal,
|
trialPartMoney:state=>{
|
let total = null
|
state.tabsModule.trxnbrList.map(res=>{
|
total += Number(res.coreBalance)
|
})
|
return total
|
}
|
})
|
},
|
watch: {
|
trxnbrArray(val){
|
this.trialPartMoneyToPage = this.trialPartMoney ? this.trialPartMoney.toFixed(2) : ''
|
if(this.trxnbrList[0] && this.trxnbrList[0].etyDat){
|
this.trialPartDateToPage = this.insertStr(this.insertStr(this.trxnbrList[0].etyDat,'4','-'),7,'-')
|
}
|
if(this.trialPartMoney > 0 ){
|
this.trialPartbtn()
|
}else{
|
this.trialPartDateToPage = ''
|
this.records = []
|
this.info = {}
|
}
|
},
|
$route() {
|
const { serialNo } = this.$route.query
|
if (serialNo) {
|
this.init()
|
}
|
}
|
}
|
}
|
</script>
|
<style lang="postcss" scoped>
|
.apply-info {
|
}
|
.apply-top-button {
|
& >>> .el-button {
|
margin-left: 20px;
|
}
|
}
|
.title-input{
|
margin: 25px 0;
|
display: flex;
|
padding: 0 10px 0 0;
|
justify-content: space-between;
|
.title-warp{
|
display: flex;
|
justify-content: space-between;
|
.blancetips {
|
font-size: 13px !important;
|
font-weight: normal !important;
|
color: #888888;
|
height: 20px;
|
line-height: 30px;
|
}
|
}
|
}
|
.qrcode-content {
|
text-align: center;
|
& .qrode-close {
|
margin: 0;
|
padding: 0;
|
margin-bottom: 10px;
|
& i {
|
cursor: pointer;
|
font-size: 18px;
|
}
|
/* text-align: right; */
|
}
|
}
|
.section-title{
|
margin: 30px 0 20px 0;
|
padding: 0 0 0 10px;
|
border-left: solid 2px #0081f0;
|
line-height: 16px;
|
font-size: 14px;
|
color: #222222;
|
}
|
</style>
|