liangjin
2021-03-22 39f63c38738cd40b142458708dee9bfbf8d1db1a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
<!--
 * @Date: 2019-08-30 11:07:43
 * @LastEditors: 小明丶
 * @LastEditTime: 2019-10-22 09:53:09
 * @Description: 
 -->
<template>
    <div class="credit-installment h-100-g">
        <x-header title="办理分期" :left-options="{backText:''}"></x-header>
        <group>
            <x-input title='商品金额' v-model="settAmt" @on-change='changeSettAmt' @on-blur='blurToCalc' :show-clear='false' :max='5' :placeholder="settLock?'选择期数后系统自动计算':'请输入商品金额'" :disabled='settLock' text-align='right'></x-input>
            <x-input title='还款总额' v-model="insAmt" @on-change='changeInsAmt' @on-blur='blurToCalc' :show-clear='false' :max='5' :placeholder="insLock?'选择期数后系统自动计算':'请输入还款总额'" :disabled='insLock' text-align='right'></x-input>
            <selector title='分期期数' ref="insTerm" placeholder='请选择分期期数' v-model="insTerm" :options='termList' :value-map="['termCode','termName']" @on-change='selectTerms' direction='rtl'></selector>
            <x-input title='商品名称' v-model="prodName" placeholder='请输入商品名称' :max='20' text-align='right'></x-input>
            <!-- <selector title='银行名称' ref='bankName' placeholder='请选择银行名称' v-model="bankName" :options='bankList' :value-map="['bankCode','bankName']" direction='rtl'></selector> -->
             <x-input title='费率' v-model="feeRate" @on-change='changeInsAmt' @on-blur='blurToCalc' :show-clear='false'  :placeholder="insLock?'选择期数后系统自动计算':'请输入费率'" :disabled='insLock' text-align='right'></x-input>
        </group>
 
        <div class="qrCode-box" v-if="dataURL">
            <div class="qrCode">
                <!-- <canvas id="canvas"></canvas> -->
 
                <img :src="dataURL" alt="qrcode">
            </div>
        </div>
        <f-button fixed @on-click='createdQRCode'>生成二维码</f-button>
    </div>
</template>
 
<script>
import QRCode from 'qrcode';
import { mapState } from 'vuex';
export default {
    name: 'credit-installment',
    data() {
        return {
            //分期期数opt
            settAmt: '',
            insAmt: '',
            insLock: false,
            settLock: false,
            needCalcInputName: '',
            feeRate: '',
            insTerm: null,
            termList: [],
            bankList: [],
            dataURL: '',
            prodName: '',
            bankName: ''
        };
    },
    computed:{
        ...mapState(['userinfo'])
    },
    created() {
        this.$api.findTerms({ typeId: this.$route.query.typeId }).then(res => {
            this.termList = res.body;
        }, err => err);
    },
    methods: {
        //计算商品金额或者还款金额的方法,因为下拉框change和input的blur都是统一方法,所以抽出来
        calcFunc() {
            if (!this.insTerm || !this.needCalcInputName) return;
            let obj = {
                term: this.insTerm
            };
            //如果填入的是商品金额,则计算还款总额,反之计算商品金额
            let v = this.$tool;
            if (this.needCalcInputName === 'insAmt') {
                if (!Number(this.settAmt)) {
                    v.toast('请输入正确的商品金额');
                    return false;
                }
                if (
                    Number(this.settAmt) < 600 ||
                    Number(this.settAmt) > 50000
                ) {
                    v.toast('商品金额必须在600-50000之间');
                    return false;
                }
                obj.settAmt = this.settAmt;
            } else if (this.needCalcInputName === 'settAmt') {
                if (!Number(this.insAmt)) {
                    v.toast('请输入正确的还款总额');
                    return false;
                }
                if (Number(this.insAmt) < 600 || Number(this.insAmt) > 50000) {
                    v.toast('还款总额必须在600-50000之间');
                    return false;
                }
                obj.insAmt = this.insAmt;
            }
            obj.resultFiled = this.needCalcInputName;
            this.$api.calAmt(obj).then(res => {
                //赋值运算结果
                this[this.needCalcInputName] = res.body.terAmt;
                this.feeRate = res.body.feeRate;
            }, err => err);
        },
        //选择期数后会自动计算商品金额和还款总额,并且渲染对应的银行列表
        selectTerms(val) {
            this.calcFunc();
        },
        createdQRCode() {
            let v = this.$tool;
            if (v.checkValEmpty(this.settAmt)) {
                v.toast('请输入商品金额');
                return false;
            }
            if (v.checkValEmpty(this.insAmt)) {
                v.toast('请输入还款总额');
                return false;
            }
            if (v.checkValEmpty(this.feeRate)) {
                v.toast('请输入费率');
                return false;
            }
            if (!Number(this.settAmt)) {
                v.toast('请输入正确的商品金额');
                return false;
            }
            if (!Number(this.insAmt)) {
                v.toast('请输入正确的还款总额');
                return false;
            }
            if (Number(this.settAmt) < 600 || Number(this.settAmt) > 50000) {
                v.toast('商品金额必须在600-50000之间');
                return false;
            }
            if (Number(this.insAmt) < 600 || Number(this.insAmt) > 50000) {
                v.toast('还款总额必须在600-50000之间');
                return false;
            }
            if (v.checkValEmpty(this.insTerm)) {
                v.toast('请选择分期期数');
                return false;
            }
            if (v.checkValEmpty(this.prodName)) {
                v.toast('请输入商品名称');
                return false;
            }
 
            let itemObj = this.termList[0].bankList[0].prodId;
            let url = `${sessionStorage.getItem('jumpUrl')}/#/?insTerm=${this.insTerm}&prodName=${this.prodName}&prodId=${itemObj}&settAmt=${this.settAmt}&insAmt=${this.insAmt}&mgrId=${this.userinfo.id}`;
            this.$router.push({
                path: '/getQRCode',
                query: {
                    insTerm: this.insTerm,
                    prodName: this.prodName,
                    prodId: itemObj,
                    settAmt: this.settAmt,
                    insAmt: this.insAmt,
                    mgrId: this.userinfo.id
                }
            });
        },
        //输入商品金额或者还款总额都会触发这个方法
        changeSettAmt(settAmt) {
            //如果等于settAmt,则说明当前正在填写商品金额或者已经计算了还款总额,就要阻止change事件继续触发
            //当needCalcInputName为空的时候,说明两个输入框的值都应该清空,这时都变成可以填写的状态
            if (this.needCalcInputName === 'settAmt') return;
            //代表正在输入商品金额,需要计算还款总额,还款总额将不可填写
            if (settAmt) {
                this.needCalcInputName = 'insAmt';
                this.insLock = true;
            } else {
                //如果输入框为空,则还原最初的状态
                this.needCalcInputName = '';
                this.insAmt = '';
                this.insLock = false;
            }
        },
        changeInsAmt(insAmt) {
            //如果等于settAmt,则说明当前正在填写商品金额或者已经计算了还款总额,就要阻止change事件继续触发
            //当needCalcInputName为空的时候,说明两个输入框的值都应该清空,这时都变成可以填写的状态
            if (this.needCalcInputName === 'insAmt') return;
            //代表正在输入还款总额,需要计算商品金额,商品金额将不可填写
            if (insAmt) {
                this.needCalcInputName = 'settAmt';
                this.settLock = true;
            } else {
                //如果输入框为空,则还原最初的状态
                this.needCalcInputName = '';
                this.settAmt = '';
                this.feeRate = '';
                this.settLock = false;
            }
        },
        //失去焦点时计算金额
        blurToCalc(val) {
            if (val) {
                this.calcFunc();
            }
        }
    }
 
};
</script>
<style lang='less' scoped>
    .credit-installment {
        padding-top: 54px;
        background-color: #f1f1f1;
        .qrCode-box {
            padding-top: 60px;
            .flexLayout(center, center, row);
            .qrCode {
                width: 200px;
                height: 200px;
                box-sizing: border-box;
                background-color: #fff;
                border: 5px solid @color-border-theme;
                padding: 5px;
                img {
                    width: 100%;
                    height: 100%;
                    vertical-align: middle;
                }
            }
        }
    }
</style>