483 lines
15 KiB
TypeScript
483 lines
15 KiB
TypeScript
import Dialog from '@vant/weapp/dialog/dialog';
|
||
import { getAction, upload, postAction } from '../../../api/base';
|
||
const dayjs = require('dayjs');
|
||
Page({
|
||
/**
|
||
* 页面的初始数据
|
||
*/
|
||
data: {
|
||
costList: [], // 车型数据
|
||
filterCostList: [], // 车型过滤
|
||
costListVal: '', // 车型查询
|
||
currentIndex: '', // 当前点击车型的序号
|
||
isSubmit: false, // 是否提交
|
||
// 展开/收起
|
||
showBox: {
|
||
base: true,
|
||
vehicleList: true
|
||
},
|
||
// 下拉选择/日期弹窗展示
|
||
showList: {
|
||
yearLimitShow: false,
|
||
costListShow: false
|
||
},
|
||
// 提交数据
|
||
params: {
|
||
projectId: '', //项目
|
||
yearLimit: 8, //年限
|
||
financingRatio: 0, //融资比例
|
||
financingRate: 0, //融资利率
|
||
overheadSharing: 0, //管理费用分担
|
||
vehicleCostList: [] // 车型信息
|
||
},
|
||
// 年限下拉
|
||
yearLimitList: [
|
||
{ value: 1, text: '1年' },
|
||
{ value: 2, text: '2年' },
|
||
{ value: 3, text: '3年' },
|
||
{ value: 4, text: '4年' },
|
||
{ value: 5, text: '5年' },
|
||
{ value: 6, text: '6年' },
|
||
{ value: 7, text: '7年' },
|
||
{ value: 8, text: '8年' }
|
||
],
|
||
// 翻译回显
|
||
dictTextList: {
|
||
yearLimit_dictText: '8年' // 租赁年限
|
||
},
|
||
// 基础信息校验
|
||
requireObj: {
|
||
projectId: '', //项目
|
||
financingRatio: '', //融资比例
|
||
financingRate: '', //融资利率
|
||
overheadSharing: '' //管理费用分担
|
||
},
|
||
// 车型信息校验
|
||
validateObj: {
|
||
vehicleCostList: [],
|
||
obj: {
|
||
unitPrice: '', //单价
|
||
purchaseTax: '', //上牌费用/购置税
|
||
insurance: '', //保险
|
||
repair: '', //维修及易损件
|
||
upkeep: '', //保养
|
||
annualAudit: '', //年审
|
||
quantity: '', //数量
|
||
salvageValue: '', //残值
|
||
oneYear: '',
|
||
twoYear: '',
|
||
threeYear: '',
|
||
fourYear: '',
|
||
fiveYear: '',
|
||
sixYear: '',
|
||
sevenYear: '',
|
||
eightYear: '',
|
||
vehicleType: '' // 车型
|
||
}
|
||
},
|
||
|
||
// 车型信息收起
|
||
vehicleCostListShow: [],
|
||
// 车型信息
|
||
vehicleTypeInfo: [
|
||
{ label: '单价', prop: 'unitPrice', append: '万元' },
|
||
{ label: '上牌/购置税', prop: 'purchaseTax', append: '万元' },
|
||
{ label: '保险(万元/台/年)', prop: 'insurance', append: '万元' },
|
||
{ label: '维修及易损件(万元)', prop: 'repair', append: '万元' },
|
||
{ label: '保养(万元)', prop: 'upkeep', append: '万元' },
|
||
{ label: '年审(万元)', prop: 'annualAudit', append: '万元' }
|
||
],
|
||
// 年收益
|
||
yearList: [
|
||
{ label: '第一年', prop: 'oneYear', append: '万元', value: 1 },
|
||
{ label: '第二年', prop: 'twoYear', append: '万元', value: 2 },
|
||
{ label: '第三年', prop: 'threeYear', append: '万元', value: 3 },
|
||
{ label: '第四年', prop: 'fourYear', append: '万元', value: 4 },
|
||
{ label: '第五年', prop: 'fiveYear', append: '万元', value: 5 },
|
||
{ label: '第六年', prop: 'sixYear', append: '万元', value: 6 },
|
||
{ label: '第七年', prop: 'sevenYear', append: '万元', value: 7 },
|
||
{ label: '第八年', prop: 'eightYear', append: '万元', value: 8 }
|
||
]
|
||
},
|
||
// 新增车型信息
|
||
addCostList() {
|
||
let data: any = { ...this.data };
|
||
let params = {
|
||
unitPrice: 0, //单价
|
||
purchaseTax: 0, //上牌费用/购置税
|
||
insurance: 0, //保险
|
||
repair: 0, //维修及易损件
|
||
upkeep: 0, //保养
|
||
annualAudit: 0, //年审
|
||
quantity: 0, //数量
|
||
salvageValue: 0, //残值
|
||
oneYear: 0,
|
||
twoYear: 0,
|
||
threeYear: 0,
|
||
fourYear: 0,
|
||
fiveYear: 0,
|
||
sixYear: 0,
|
||
sevenYear: 0,
|
||
eightYear: 0,
|
||
vehicleType_dictText: '', // 车型回显
|
||
vehicleType: '' // 车型
|
||
};
|
||
data.params.vehicleCostList.push(JSON.parse(JSON.stringify(params)));
|
||
data.validateObj.vehicleCostList.push(JSON.parse(JSON.stringify(params))); // 校验
|
||
data.vehicleCostListShow.push(true); // 显隐
|
||
this.setData(data);
|
||
},
|
||
deleteCostList(event: any) {
|
||
let { index } = event.currentTarget.dataset;
|
||
let data: any = { ...this.data };
|
||
data.params.vehicleCostList.splice(index, 1);
|
||
data.vehicleCostListShow.splice(index, 1); // 删除显隐
|
||
this.setData(data);
|
||
},
|
||
// 展示和收起
|
||
showBoxInf(event: any) {
|
||
let data: any = { ...this.data };
|
||
let { fieldname, index } = event.currentTarget.dataset;
|
||
if (fieldname == 'vehicleCostList') {
|
||
data.vehicleCostListShow[index] = !data.vehicleCostListShow[index];
|
||
} else data.showBox[fieldname] = !data.showBox[fieldname];
|
||
this.setData(data);
|
||
},
|
||
//下拉框切换是否展示
|
||
pickerChange(event: any) {
|
||
let { fieldname, index } = event.currentTarget.dataset;
|
||
let data: any = { ...this.data };
|
||
data.showList[fieldname] = true;
|
||
data.currentIndex = index;
|
||
this.setData(data);
|
||
},
|
||
// 下拉选择/日期确认
|
||
pickerConfirm(event: any) {
|
||
//下拉框点击确认
|
||
let { fieldname, dicttext } = event.currentTarget.dataset;
|
||
let detail = event.detail;
|
||
let data: any = { ...this.data };
|
||
if (fieldname == 'yearLimit') {
|
||
data.params[fieldname] = detail.value.value;
|
||
data.dictTextList[dicttext] = detail.value.text;
|
||
} else if (fieldname == 'vehicleType') {
|
||
// data.params.vehicleCostList[data.currentIndex].vehicleType = detail.value.value
|
||
let keys = Object.keys(data.params.vehicleCostList[data.currentIndex]);
|
||
keys.forEach((item: any) => {
|
||
if (detail.value[item])
|
||
data.params.vehicleCostList[data.currentIndex][item] =
|
||
detail.value[item];
|
||
else data.params.vehicleCostList[data.currentIndex][item] = 0;
|
||
});
|
||
data.params.vehicleCostList[data.currentIndex].vehicleType_dictText =
|
||
detail.value.value;
|
||
data.validateObj.vehicleCostList[data.currentIndex].vehicleType = '';
|
||
}
|
||
|
||
this.setData(data);
|
||
this.hidePicker();
|
||
},
|
||
|
||
// 项目过滤
|
||
filterCostList(event: any) {
|
||
let list = [] as any;
|
||
this.data.costList.forEach((item: any) => {
|
||
if (item.text.toLowerCase().indexOf(event.detail.toLowerCase()) >= 0) {
|
||
list.push(item);
|
||
}
|
||
});
|
||
this.setData({
|
||
filterCostList: list,
|
||
costListVal: event.detail
|
||
});
|
||
},
|
||
|
||
// 关闭下拉选择/日期选择
|
||
hidePicker() {
|
||
let keys = Object.keys(this.data.showList);
|
||
let list = this.data.showList as any;
|
||
keys.forEach(item => {
|
||
list[item] = false;
|
||
});
|
||
this.setData({
|
||
showList: list
|
||
});
|
||
},
|
||
// input输入
|
||
inputChange(event: any) {
|
||
let { fieldname, type, require } = event.currentTarget.dataset;
|
||
let data: any = this.data;
|
||
let result = event.detail.value;
|
||
let regex = /[!@#$%^&*?><|\\\\]/;
|
||
let spaceRegex = new RegExp(/\s+/g);
|
||
let message = '';
|
||
// 有填写内容,校验特殊字符
|
||
if (result && regex.test(result)) {
|
||
message = '不支持特殊字符';
|
||
} else if (spaceRegex.test(result)) message = '不支持含有空格';
|
||
// 没有填写内容且不为必填
|
||
else if (!result && require != 'norequire') {
|
||
message = '请填写必填项';
|
||
} else if (result.length > 32) {
|
||
message = '输入长度不得超过32个字符';
|
||
} else if (result) {
|
||
message = '';
|
||
}
|
||
if (require != 'norequire') {
|
||
data.requireObj[fieldname] = message;
|
||
}
|
||
data.params[fieldname] = result;
|
||
this.setData(data);
|
||
},
|
||
|
||
// 数字输入
|
||
numberChange(event: any) {
|
||
let { fieldname, type, require, index } = event.currentTarget.dataset;
|
||
let data: any = this.data;
|
||
let result = event.detail.value;
|
||
let message = '';
|
||
const moneyNumberExp: RegExp = /^\d{1,9}(\.\d{1,4})?$/; //金额限制整数部分不能大于9位 小数部分不能大于4位
|
||
const rateNumberExp: RegExp = /^\d+(\.\d{1,2})?$/; //小数部分不能大于2位
|
||
if (type == 'rate') {
|
||
if (result != '') {
|
||
data.params[fieldname] = Number(result);
|
||
if (result > 100) message = '百分比不能大于100%';
|
||
else if (result < 0) data.params[fieldname] = 0;
|
||
else if (!rateNumberExp.test(event.detail.value))
|
||
message = '小数部分不能大于2位';
|
||
} else data.params[fieldname] = 0;
|
||
} else if (type == 'money') {
|
||
if (result != '') {
|
||
data.params.vehicleCostList[index][fieldname] = Number(result);
|
||
if (result < 0) data.params.vehicleCostList[index][fieldname] = 0;
|
||
else if (!moneyNumberExp.test(event.detail.value))
|
||
message = '金额限制整数部分不能大于9位,小数部分不能大于4位';
|
||
} else data.params.vehicleCostList[index][fieldname] = 0;
|
||
} else if (type == 'quantity') {
|
||
if (result != '') {
|
||
data.params.vehicleCostList[index][fieldname] = Number(result);
|
||
if (result < 0) data.params.vehicleCostList[index][fieldname] = 0;
|
||
else if (result > 100000) message = '数量不能大于100000';
|
||
} else data.params.vehicleCostList[index][fieldname] = 0;
|
||
}
|
||
if (require != 'noRequire') {
|
||
data.requireObj[fieldname] = message;
|
||
} else {
|
||
if (index !== undefined) {
|
||
data.validateObj.vehicleCostList[index][fieldname] = message;
|
||
}
|
||
}
|
||
|
||
this.setData(data);
|
||
},
|
||
// 数量加减
|
||
plusAndsubtract(event: any) {
|
||
let { type, index } = event.currentTarget.dataset;
|
||
let data: any = this.data;
|
||
let message = '';
|
||
if (type == 'plus') data.params.vehicleCostList[index].quantity += 1;
|
||
else if (type == 'subtract')
|
||
data.params.vehicleCostList[index].quantity -= 1;
|
||
if (data.params.vehicleCostList[index].quantity < 0)
|
||
data.params.vehicleCostList[index].quantity = 0;
|
||
else if (data.params.vehicleCostList[index].quantity > 100000)
|
||
message = '数量不能大于100000';
|
||
else if (data.params.vehicleCostList[index].quantity <= 100000)
|
||
message = '';
|
||
data.validateObj.vehicleCostList[index].quantity = message;
|
||
this.setData(data);
|
||
},
|
||
// 校验
|
||
validateFn() {
|
||
let data: any = this.data;
|
||
let result = true;
|
||
// 基础信息校验
|
||
let requireObjKeys = Object.keys(data.requireObj);
|
||
requireObjKeys.forEach((item: any) => {
|
||
if (data.params[item] === '') {
|
||
data.requireObj[item] = '请填写必填项';
|
||
result = false;
|
||
}
|
||
});
|
||
// 车型信息校验
|
||
let validateObjKeys = Object.keys(data.validateObj.obj);
|
||
data.params.vehicleCostList.forEach((item: any, index: any) => {
|
||
validateObjKeys.forEach((el: any) => {
|
||
let message = '';
|
||
const moneyNumberExp: RegExp = /^\d{1,9}(\.\d{1,4})?$/; //金额限制整数部分不能大于9位 小数部分不能大于4位
|
||
if (el == 'vehicleType') {
|
||
if (!item[el]) {
|
||
message = '请填写必填项';
|
||
result = false;
|
||
}
|
||
} else if (el == 'quantity') {
|
||
if (item[el] > 100000) {
|
||
message = '数量不能大于100000';
|
||
result = false;
|
||
}
|
||
} else {
|
||
if (!moneyNumberExp.test(item[el])) {
|
||
message = '金额限制整数部分不能大于9位,小数部分不能大于4位';
|
||
result = false;
|
||
}
|
||
}
|
||
// item[el] = message
|
||
data.validateObj.vehicleCostList[index][el] = message;
|
||
});
|
||
});
|
||
this.setData(data);
|
||
return result;
|
||
},
|
||
|
||
// 提交
|
||
formSubmit() {
|
||
let data: any = this.data;
|
||
if (data.isSubmit) return;
|
||
// if (data.params.vehicleCostList.length == 0 ? true : false) {
|
||
// wx.showToast({
|
||
// title: '请新增车型信息',
|
||
// icon: 'none'
|
||
// })
|
||
// return
|
||
// }
|
||
// 校验
|
||
if (!this.validateFn()) return;
|
||
// 如果有修改租赁年限,需要清空高于租赁年限的数据
|
||
// 当前年限以上的数据归零
|
||
data.params.vehicleCostList.forEach((item: any) => {
|
||
data.yearList.forEach((el: any, index: number) => {
|
||
if (data.yearLimitList[index].value > data.params.yearLimit)
|
||
item[el.prop] = 0;
|
||
});
|
||
});
|
||
// 校验是否有数量为0
|
||
let result = data.params.vehicleCostList.some((item: any) => {
|
||
return item.quantity === 0;
|
||
});
|
||
if (result) {
|
||
Dialog.confirm({
|
||
title: '提示',
|
||
message: '有车型信息数据中的数量值为零,会影响测算结果,是否进行测算'
|
||
})
|
||
.then(() => {
|
||
wx.showLoading({
|
||
title: '加载中'
|
||
});
|
||
this.setData({
|
||
isSubmit: true
|
||
});
|
||
this.submitFn(data);
|
||
})
|
||
.catch(() => {});
|
||
} else {
|
||
wx.showLoading({
|
||
title: '加载中'
|
||
});
|
||
this.setData({
|
||
isSubmit: true
|
||
});
|
||
this.submitFn(data);
|
||
}
|
||
},
|
||
submitFn(data: any) {
|
||
postAction('api/finance/calculate/calculate', data.params)
|
||
.then((res: any) => {
|
||
if (res.success) {
|
||
wx.showToast({
|
||
title: '测算成功',
|
||
icon: 'none'
|
||
});
|
||
let data: any = this.data;
|
||
data.params.calculateObject = res.result;
|
||
wx.setStorageSync('costEstimationData', {
|
||
info: data.params,
|
||
type: 'add'
|
||
});
|
||
setTimeout(() => {
|
||
wx.navigateTo({
|
||
url: '../costEstimationDetail/costEstimationDetail',
|
||
fail: e => {
|
||
console.log(e);
|
||
}
|
||
});
|
||
this.setData({
|
||
isSubmit: false
|
||
});
|
||
wx.hideLoading();
|
||
}, 1000);
|
||
} else {
|
||
wx.hideLoading();
|
||
wx.showToast({
|
||
title: res.message,
|
||
icon: 'none'
|
||
});
|
||
this.setData({
|
||
isSubmit: false
|
||
});
|
||
}
|
||
})
|
||
.catch(err => {
|
||
console.log(err);
|
||
this.setData({
|
||
isSubmit: false
|
||
});
|
||
wx.hideLoading();
|
||
});
|
||
},
|
||
// 获取车型数据
|
||
getCostList() {
|
||
getAction('api/finance/calculate/costList').then((res: any) => {
|
||
let result: any = res.result;
|
||
result.forEach((item: any) => {
|
||
item.text = item.vehicleType;
|
||
item.value = item.vehicleType;
|
||
});
|
||
this.setData({
|
||
costList: result, // 车型数据
|
||
filterCostList: result // 车型过滤
|
||
});
|
||
});
|
||
},
|
||
/**
|
||
* 生命周期函数--监听页面加载
|
||
*/
|
||
onLoad() {
|
||
this.getCostList();
|
||
},
|
||
|
||
/**
|
||
* 生命周期函数--监听页面初次渲染完成
|
||
*/
|
||
onReady() {},
|
||
|
||
/**
|
||
* 生命周期函数--监听页面显示
|
||
*/
|
||
onShow() {},
|
||
|
||
/**
|
||
* 生命周期函数--监听页面隐藏
|
||
*/
|
||
onHide() {},
|
||
|
||
/**
|
||
* 生命周期函数--监听页面卸载
|
||
*/
|
||
onUnload() {},
|
||
|
||
/**
|
||
* 页面相关事件处理函数--监听用户下拉动作
|
||
*/
|
||
onPullDownRefresh() {},
|
||
|
||
/**
|
||
* 页面上拉触底事件的处理函数
|
||
*/
|
||
onReachBottom() {},
|
||
|
||
/**
|
||
* 用户点击右上角分享
|
||
*/
|
||
onShareAppMessage() {}
|
||
});
|