585 lines
16 KiB
Vue
585 lines
16 KiB
Vue
|
<template>
|
|||
|
<!-- <div class="applyLoanForm">applyLoanForm</div> -->
|
|||
|
<div class="applyLoanForm">
|
|||
|
<view>
|
|||
|
<uni-forms
|
|||
|
class="form"
|
|||
|
ref="form"
|
|||
|
:model="form"
|
|||
|
:rules="rules"
|
|||
|
label-position="top"
|
|||
|
label-width="100%"
|
|||
|
validate-trigger="bind"
|
|||
|
>
|
|||
|
<uni-forms-item label="贷款产品" name="loanProductId">
|
|||
|
<uni-data-select
|
|||
|
v-model="form.loanProductId"
|
|||
|
:localdata="allLoanProduct"
|
|||
|
placeholder="请选择贷款产品"
|
|||
|
/>
|
|||
|
</uni-forms-item>
|
|||
|
<uni-forms-item label="经营主体" name="baseinfoId">
|
|||
|
<uni-data-select
|
|||
|
v-model="form.baseinfoId"
|
|||
|
:localdata="listBaseInfo"
|
|||
|
placeholder="请选择经营主体"
|
|||
|
/>
|
|||
|
</uni-forms-item>
|
|||
|
<uni-forms-item label="申请用户姓名" name="loanUserName">
|
|||
|
<uni-easyinput
|
|||
|
v-model="form.loanUserName"
|
|||
|
placeholder="请输入申请用户姓名"
|
|||
|
/>
|
|||
|
</uni-forms-item>
|
|||
|
<uni-forms-item label="申请用户身份证" name="loanUserCard">
|
|||
|
<uni-easyinput
|
|||
|
v-model="form.loanUserCard"
|
|||
|
placeholder="请输入申请用户身份证"
|
|||
|
/>
|
|||
|
</uni-forms-item>
|
|||
|
<uni-forms-item label="申请用户电话" name="loanUserTel">
|
|||
|
<uni-easyinput
|
|||
|
v-model="form.loanUserTel"
|
|||
|
placeholder="请输入申请用户电话"
|
|||
|
/>
|
|||
|
</uni-forms-item>
|
|||
|
<uni-forms-item label="贷款金额(万元)" name="loanLimit">
|
|||
|
<uni-number-box
|
|||
|
v-model="form.loanLimit"
|
|||
|
placeholder="请输入贷款金额(万元)"
|
|||
|
/>
|
|||
|
</uni-forms-item>
|
|||
|
<uni-forms-item label="上报时间" name="registrationTime">
|
|||
|
<uni-datetime-picker
|
|||
|
type="date"
|
|||
|
placeholder="请选择上报时间"
|
|||
|
v-model="form.registrationTime"
|
|||
|
/>
|
|||
|
</uni-forms-item>
|
|||
|
<uni-forms-item label="申请资料附件" name="fileUrl">
|
|||
|
<uni-file-picker
|
|||
|
fileMediatype="all"
|
|||
|
limit="5"
|
|||
|
title="上传文件数量不能超过 5 个"
|
|||
|
v-model="fileUrl"
|
|||
|
@progress="progress"
|
|||
|
@select="select"
|
|||
|
/>
|
|||
|
</uni-forms-item>
|
|||
|
<uni-forms-item label="描述" name="remark">
|
|||
|
<uni-easyinput v-model="form.remark" placeholder="请输入描述" />
|
|||
|
</uni-forms-item>
|
|||
|
</uni-forms>
|
|||
|
|
|||
|
<view style="height: 44px">
|
|||
|
<button v-if="false">
|
|||
|
<text>{{ "测 试" }}</text>
|
|||
|
</button>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<view v-if="true" class="foot">
|
|||
|
<button @click="cencel" :plain="false" class="cencel">
|
|||
|
<text>{{ "取 消" }}</text>
|
|||
|
</button>
|
|||
|
<!-- <button @click="text" type="primary" class="confirm"> -->
|
|||
|
<button @click="showConfirm" type="primary" class="confirm">
|
|||
|
<text>{{ "确 认" }}</text>
|
|||
|
</button>
|
|||
|
</view>
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import {
|
|||
|
listLoanUserApply,
|
|||
|
getLoanUserApply,
|
|||
|
delLoanUserApply,
|
|||
|
addLoanUserApply,
|
|||
|
updateLoanUserApply,
|
|||
|
} from "@/api/financialCredit/loanUserApply";
|
|||
|
import { getAllLoanProduct } from "@/api/financialCredit/loanProduct";
|
|||
|
import { selectUserEntity } from "@/api/enterprise/userEntity";
|
|||
|
|
|||
|
export default {
|
|||
|
name: "applyLoanForm",
|
|||
|
components: {},
|
|||
|
props: {},
|
|||
|
data() {
|
|||
|
/**
|
|||
|
* 手机号码格式验证
|
|||
|
* @param rule 验证规则
|
|||
|
* @param value 需要验证的值
|
|||
|
* @param callback 回调函数
|
|||
|
*/
|
|||
|
const validateMobile = (rule, value, callback) => {
|
|||
|
return new Promise((resolve, reject) => {
|
|||
|
var reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
|
|||
|
if (!reg.test(value)) {
|
|||
|
reject(new Error("手机号格式错误"));
|
|||
|
} else {
|
|||
|
resolve();
|
|||
|
}
|
|||
|
});
|
|||
|
};
|
|||
|
/**
|
|||
|
* @description : 校验身份证号是否合规(18位、15位)
|
|||
|
* @param {String|Number} value
|
|||
|
* @return {Boolean} true-合规 false-不合规
|
|||
|
*/
|
|||
|
const checkPsidno = (rule, value, callback) => {
|
|||
|
return new Promise((resolve, reject) => {
|
|||
|
const psidno = String(value);
|
|||
|
// 1.校验身份证号格式和长度
|
|||
|
const regPsidno =
|
|||
|
/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[X])$)$/;
|
|||
|
if (!regPsidno.test(psidno)) {
|
|||
|
reject(new Error("身份证号格式错误"));
|
|||
|
}
|
|||
|
// 2.校验前两位的省份编码是否正确
|
|||
|
const province = {
|
|||
|
11: "北京",
|
|||
|
12: "天津",
|
|||
|
13: "河北",
|
|||
|
14: "山西",
|
|||
|
15: "内蒙古",
|
|||
|
21: "辽宁",
|
|||
|
22: "吉林",
|
|||
|
23: "黑龙江 ",
|
|||
|
31: "上海",
|
|||
|
32: "江苏",
|
|||
|
33: "浙江",
|
|||
|
34: "安徽",
|
|||
|
35: "福建",
|
|||
|
36: "江西",
|
|||
|
37: "山东",
|
|||
|
41: "河南",
|
|||
|
42: "湖北 ",
|
|||
|
43: "湖南",
|
|||
|
44: "广东",
|
|||
|
45: "广西",
|
|||
|
46: "海南",
|
|||
|
50: "重庆",
|
|||
|
51: "四川",
|
|||
|
52: "贵州",
|
|||
|
53: "云南",
|
|||
|
54: "西藏 ",
|
|||
|
61: "陕西",
|
|||
|
62: "甘肃",
|
|||
|
63: "青海",
|
|||
|
64: "宁夏",
|
|||
|
65: "新疆",
|
|||
|
71: "台湾",
|
|||
|
81: "香港",
|
|||
|
82: "澳门",
|
|||
|
91: "国外",
|
|||
|
};
|
|||
|
if (!province[Number(psidno.slice(0, 2))]) {
|
|||
|
reject(new Error("身份证号格式错误"));
|
|||
|
}
|
|||
|
// 3.校验出生日期
|
|||
|
if (psidno.length === 15) {
|
|||
|
// 15位号码 省(2位)市(2位)县(2位)年(2位)月(2位)日(2位)校验码(3位)
|
|||
|
const reg = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
|
|||
|
const arrSplit = psidno.match(reg);
|
|||
|
// 15位号码在年份前补 19 或 20
|
|||
|
const year =
|
|||
|
Number(arrSplit[2].charAt(0)) > 0
|
|||
|
? "19" + arrSplit[2]
|
|||
|
: "20" + arrSplit[2];
|
|||
|
const month = arrSplit[3];
|
|||
|
const day = arrSplit[4];
|
|||
|
if (!validateBirthday(year, month, day)) {
|
|||
|
reject(new Error("身份证号格式错误"));
|
|||
|
}
|
|||
|
} else if (psidno.length === 18) {
|
|||
|
// 18位号码 省(2位)市(2位)县(2位)年(4位)月(2位)日(2位)校验码(4位)
|
|||
|
const reg = new RegExp(
|
|||
|
/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/
|
|||
|
);
|
|||
|
const arrSplit = psidno.match(reg);
|
|||
|
const year = arrSplit[2];
|
|||
|
const month = arrSplit[3];
|
|||
|
const day = arrSplit[4];
|
|||
|
if (!validateBirthday(year, month, day)) {
|
|||
|
reject(new Error("身份证号格式错误"));
|
|||
|
}
|
|||
|
} else {
|
|||
|
reject(new Error("身份证号格式错误"));
|
|||
|
}
|
|||
|
// 校验出生日期是否合理
|
|||
|
function validateBirthday(year, month, day) {
|
|||
|
year = Number(year); // 年
|
|||
|
month = Number(month); // 月
|
|||
|
day = Number(day); // 日
|
|||
|
const nowTime = new Date().getTime(); // 当前时间戳
|
|||
|
const birthTime = new Date(`${year}-${month}-${day}`).getTime(); // 获取出生日期的时间戳
|
|||
|
// 不能是明天出生的吧
|
|||
|
if (birthTime > nowTime) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// 一般人活不到150岁吧
|
|||
|
const nowYear = new Date().getFullYear();
|
|||
|
if (nowYear - year > 150) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// 不能是13月出生的吧
|
|||
|
if (month < 1 || month > 12) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// 不能是2月30号、4月31号、5月32号出生的吧
|
|||
|
const date = new Date(year, month, 0); // 获取当月的最后一天
|
|||
|
if (day < 1 || day > date.getDate()) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
// 4.18位号码校验生成的校验码
|
|||
|
if (psidno.length === 18) {
|
|||
|
const Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 加权因子
|
|||
|
const parity = [
|
|||
|
"1",
|
|||
|
"0",
|
|||
|
"X",
|
|||
|
"9",
|
|||
|
"8",
|
|||
|
"7",
|
|||
|
"6",
|
|||
|
"5",
|
|||
|
"4",
|
|||
|
"3",
|
|||
|
"2",
|
|||
|
]; // 校验码
|
|||
|
let sum = 0;
|
|||
|
for (let i = 0; i < 17; i++) {
|
|||
|
sum += Number(psidno.charAt(i)) * Wi[i];
|
|||
|
}
|
|||
|
if (parity[sum % 11] !== psidno[17]) {
|
|||
|
reject(new Error("身份证号格式错误"));
|
|||
|
}
|
|||
|
}
|
|||
|
resolve();
|
|||
|
});
|
|||
|
};
|
|||
|
return {
|
|||
|
loading: false,
|
|||
|
// haveEnterprise: false,
|
|||
|
fileUrl: [],
|
|||
|
allLoanProduct: [],
|
|||
|
listBaseInfo: [],
|
|||
|
businessLicenseUrl: [],
|
|||
|
landmarkType: [],
|
|||
|
form: {
|
|||
|
loanLimit: 0,
|
|||
|
},
|
|||
|
dictLists: {},
|
|||
|
rules: {
|
|||
|
// fullName: {
|
|||
|
// rules: [
|
|||
|
// {
|
|||
|
// required: true,
|
|||
|
// errorMessage: "请输入主体名称",
|
|||
|
// },
|
|||
|
// ],
|
|||
|
// },
|
|||
|
loanProductId: {
|
|||
|
rules: [
|
|||
|
{
|
|||
|
required: true,
|
|||
|
errorMessage: "保险产品不能为空",
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
baseinfoId: {
|
|||
|
rules: [
|
|||
|
{
|
|||
|
required: true,
|
|||
|
errorMessage: "经营主体不能为空",
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
loanUserTel: {
|
|||
|
rules: [
|
|||
|
{
|
|||
|
required: true,
|
|||
|
errorMessage: "请输入联系电话",
|
|||
|
validateFunction: (rule, value, data, callback) =>
|
|||
|
validateMobile(rule, value, data, callback),
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
loanUserCard: {
|
|||
|
rules: [
|
|||
|
{
|
|||
|
required: true,
|
|||
|
errorMessage: "请输入身份证号",
|
|||
|
validateFunction: (rule, value, data, callback) =>
|
|||
|
checkPsidno(rule, value, data, callback),
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
},
|
|||
|
address: "",
|
|||
|
options: {},
|
|||
|
};
|
|||
|
},
|
|||
|
computed: {},
|
|||
|
methods: {
|
|||
|
async getRouter(options) {
|
|||
|
this.$set(this.form, "loanProductId", parseInt(options.loanProductId));
|
|||
|
this.$set(this.form, "baseinfoId", parseInt(options.baseinfoId));
|
|||
|
this.$set(this.options, "id", parseInt(options.id));
|
|||
|
},
|
|||
|
text() {
|
|||
|
console.log(this.form);
|
|||
|
},
|
|||
|
reset() {
|
|||
|
this.form = {
|
|||
|
id: null,
|
|||
|
loanUser: null,
|
|||
|
baseinfoId: null,
|
|||
|
loanProductId: null,
|
|||
|
loanUserName: null,
|
|||
|
loanUserCard: null,
|
|||
|
loanUserTel: null,
|
|||
|
loanLimit: 0,
|
|||
|
reportTime: null,
|
|||
|
fileUrl: null,
|
|||
|
status: 0,
|
|||
|
remark: null,
|
|||
|
createBy: null,
|
|||
|
createTime: null,
|
|||
|
updateBy: null,
|
|||
|
updateTime: null,
|
|||
|
};
|
|||
|
},
|
|||
|
listallBaseInfo() {
|
|||
|
selectUserEntity().then((response) => {
|
|||
|
const list = response.data;
|
|||
|
let dataList = [];
|
|||
|
for (const item of list) {
|
|||
|
let element = {};
|
|||
|
element["value"] = item.value;
|
|||
|
element["text"] = item.label;
|
|||
|
dataList.push(element);
|
|||
|
}
|
|||
|
this.listBaseInfo = dataList;
|
|||
|
});
|
|||
|
},
|
|||
|
getallLoanProduct() {
|
|||
|
getAllLoanProduct().then((response) => {
|
|||
|
const list = response.data;
|
|||
|
let dataList = [];
|
|||
|
for (const item of list) {
|
|||
|
let element = {};
|
|||
|
element["value"] = item.id;
|
|||
|
element["text"] = item.loanCommodity;
|
|||
|
dataList.push(element);
|
|||
|
}
|
|||
|
this.allLoanProduct = dataList;
|
|||
|
});
|
|||
|
},
|
|||
|
authenticationUrlSucces() {},
|
|||
|
async initializeDict() {
|
|||
|
this.dictByType("sys_yes_no");
|
|||
|
},
|
|||
|
dictByType(type) {
|
|||
|
this.getDicts(type).then((response) => {
|
|||
|
let dicts = [];
|
|||
|
for (let dict of response.data) {
|
|||
|
let element = {};
|
|||
|
element["value"] = dict.dictValue;
|
|||
|
element["text"] = dict.dictLabel;
|
|||
|
element["label"] = dict.dictLabel;
|
|||
|
dicts.push(element);
|
|||
|
}
|
|||
|
this.$set(this.dictLists, type, dicts);
|
|||
|
});
|
|||
|
},
|
|||
|
select(tempFiles) {
|
|||
|
let urls = [];
|
|||
|
for (const item of tempFiles.tempFilePaths) {
|
|||
|
// urls.push(tempFiles.tempFilePaths);
|
|||
|
urls.push(item);
|
|||
|
}
|
|||
|
this.form.fileUrl = urls;
|
|||
|
this.fileUrl = urls;
|
|||
|
},
|
|||
|
naviBack(isNew) {
|
|||
|
console.log(isNew);
|
|||
|
let pages = getCurrentPages(); //关于获取页面的官方文档https://uniapp.dcloud.io/api/window/window
|
|||
|
let prevPage = pages[pages.length - 2];
|
|||
|
uni.navigateBack({
|
|||
|
delta: 1,
|
|||
|
success: () => {
|
|||
|
if (isNew !== undefined) {
|
|||
|
setTimeout(function () {
|
|||
|
prevPage.$vm.getMsg(isNew);
|
|||
|
}, 200);
|
|||
|
}
|
|||
|
},
|
|||
|
});
|
|||
|
},
|
|||
|
cencel() {
|
|||
|
this.naviBack();
|
|||
|
},
|
|||
|
submitForm() {
|
|||
|
let form = this.form;
|
|||
|
let isNew =
|
|||
|
this.form.id === null ||
|
|||
|
this.form.id === undefined ||
|
|||
|
this.form.id === "";
|
|||
|
if (
|
|||
|
form.fileUrl === undefined ||
|
|||
|
form.fileUrl === [] ||
|
|||
|
form.fileUrl === null ||
|
|||
|
form.fileUrl.length === 0
|
|||
|
) {
|
|||
|
this.form.fileUrl = "";
|
|||
|
} else {
|
|||
|
this.form.fileUrl = form.fileUrl.toString(",");
|
|||
|
}
|
|||
|
if (isNew) {
|
|||
|
addLoanUserApply(this.form)
|
|||
|
.catch((err) => {
|
|||
|
this.naviBack(err);
|
|||
|
})
|
|||
|
.then((response) => {
|
|||
|
this.naviBack(isNew);
|
|||
|
});
|
|||
|
} else {
|
|||
|
updateLoanUserApply(this.form)
|
|||
|
.catch((err) => {
|
|||
|
this.naviBack(err);
|
|||
|
})
|
|||
|
.then((response) => {
|
|||
|
this.naviBack(isNew);
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
getLoanUserApplyById() {
|
|||
|
this.$modal.loading("加载中,请耐心等待...");
|
|||
|
getLoanUserApply(this.options.id).then((response) => {
|
|||
|
console.log(response);
|
|||
|
this.form = response.data;
|
|||
|
this.$modal.closeLoading();
|
|||
|
});
|
|||
|
},
|
|||
|
showConfirm() {
|
|||
|
this.$refs["form"].validate().then((res) => {
|
|||
|
this.$cus_modal.confirm().then((conf_res) => {
|
|||
|
if (conf_res.confirm === true) {
|
|||
|
this.submitForm();
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
},
|
|||
|
watch: {},
|
|||
|
|
|||
|
// 页面周期函数--监听页面加载
|
|||
|
onLoad(options) {
|
|||
|
this.reset();
|
|||
|
this.getRouter(options).then(() => {
|
|||
|
console.log("=================options=====================");
|
|||
|
console.log(options);
|
|||
|
console.log("=================this.options=====================");
|
|||
|
console.log(this.options);
|
|||
|
if (options.id != undefined) {
|
|||
|
this.getLoanUserApplyById();
|
|||
|
}
|
|||
|
});
|
|||
|
this.initializeDict();
|
|||
|
this.getallLoanProduct();
|
|||
|
this.listallBaseInfo();
|
|||
|
},
|
|||
|
// 页面周期函数--监听页面初次渲染完成
|
|||
|
onReady() {},
|
|||
|
// 页面周期函数--监听页面显示(not-nvue)
|
|||
|
onShow() {},
|
|||
|
// 页面周期函数--监听页面隐藏
|
|||
|
onHide() {},
|
|||
|
// 页面周期函数--监听页面卸载
|
|||
|
onUnload() {
|
|||
|
const that = this
|
|||
|
return that.$listenOB.goBack()
|
|||
|
},
|
|||
|
// 页面处理函数--监听用户下拉动作
|
|||
|
// onPullDownRefresh() { uni.stopPullDownRefresh(); },
|
|||
|
// 页面处理函数--监听用户上拉触底
|
|||
|
// onReachBottom() {},
|
|||
|
// 页面处理函数--监听页面滚动(not-nvue)
|
|||
|
// onPageScroll(event) {},
|
|||
|
// 页面处理函数--用户点击右上角分享
|
|||
|
// onShareAppMessage(options) {},
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
page {
|
|||
|
background: white;
|
|||
|
}
|
|||
|
|
|||
|
.form {
|
|||
|
text-align: center;
|
|||
|
margin: auto;
|
|||
|
width: 80%;
|
|||
|
}
|
|||
|
|
|||
|
.applyLoanForm {
|
|||
|
background-color: white;
|
|||
|
height: calc(100%);
|
|||
|
|
|||
|
/deep/ .uni-forms-item {
|
|||
|
.uni-forms-item__content {
|
|||
|
.uni-file-picker {
|
|||
|
.uni-file-picker__header {
|
|||
|
.file-title {
|
|||
|
span {
|
|||
|
color: #ff0000a6;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.uni-mt-5 {
|
|||
|
.uni-icons {
|
|||
|
background: #007aff21;
|
|||
|
line-height: 35px;
|
|||
|
height: 35px;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.uni-select-cy {
|
|||
|
z-index: 1;
|
|||
|
|
|||
|
.uni-select-cy-select {
|
|||
|
z-index: -500;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.foot {
|
|||
|
width: 100vw;
|
|||
|
height: 44px;
|
|||
|
bottom: 0px;
|
|||
|
display: flex;
|
|||
|
position: fixed;
|
|||
|
z-index: 2;
|
|||
|
.cencel {
|
|||
|
border-radius: 0px;
|
|||
|
border: 0px;
|
|||
|
width: 50%;
|
|||
|
background-color: white;
|
|||
|
}
|
|||
|
|
|||
|
.confirm {
|
|||
|
border-radius: 0px;
|
|||
|
border: 0px;
|
|||
|
width: 50%;
|
|||
|
color: white;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|