1170 lines
35 KiB
TypeScript
1170 lines
35 KiB
TypeScript
// pages/violationReporting/violationReporting.ts
|
|
import { getAction, upload, postAction, putAction } from '../../../api/base';
|
|
const dayjs = require('dayjs');
|
|
Page({
|
|
/**
|
|
* 页面的初始数据
|
|
*/
|
|
data: {
|
|
isSubmit: false,
|
|
// 是否编辑
|
|
isEdit: false,
|
|
// 展开/收起
|
|
showBox: {
|
|
base: true,
|
|
followInfo: true,
|
|
inspectionInfo: true,
|
|
feedbackInfo: true,
|
|
handleInfo: true
|
|
},
|
|
// 内容勾选
|
|
contentItem: {
|
|
inspectionTask: false, // 车辆巡检
|
|
opinion: false, // 意见反馈
|
|
handle: false // 异常处理 巡检结果未不合格时
|
|
},
|
|
// 下拉选择/日期弹窗展示
|
|
showList: {
|
|
projectShow: false,
|
|
reviewTypeShow: false,
|
|
reviewTimeShow: false,
|
|
resultStatusShow: false,
|
|
inspectionResultShow: false,
|
|
opinionTypeShow: false,
|
|
userShow: false,
|
|
reviewUserShow: false,
|
|
customerFollowTemplateShow: false,
|
|
inspectionTemplateShow: false,
|
|
pleasedStatusShow: false,
|
|
handleTypeShow: false,
|
|
handleTimeShow: false
|
|
},
|
|
// 提交数据
|
|
params: {
|
|
id: '', // id
|
|
projectId: '', // 项目id
|
|
reviewType: '', // 回访方式
|
|
reviewTime: '', // 回访时间
|
|
remark: '', // 备注
|
|
templateId: '', // 回访模板
|
|
partList: '', // 模板数据、
|
|
reviewUserId: '', // 回访人
|
|
resultStatus: '', // 回访结果
|
|
fileUrl: '', // 附件
|
|
// 车辆巡检
|
|
inspectionTask: {
|
|
inspectionTemplateId: '', // 巡检模板
|
|
inspectionResult: '', // 巡检结果
|
|
remark: '', // 备注
|
|
fileUrl: '',
|
|
handlePlan: '', // 处理方案
|
|
handleType: '', // 处理结果
|
|
handleTime: '' // 处理时间
|
|
},
|
|
// 意见反馈
|
|
opinion: {
|
|
name: '', // 意见标题
|
|
opinionType: '', // 意见分类
|
|
proposeName: '', // 提议人
|
|
phone: '', // 联系电话
|
|
content: '', // 意见内容
|
|
handleId: '', // 处理人
|
|
fileUrl: '', // 附件
|
|
remark: '' // 备注
|
|
}
|
|
},
|
|
// 翻译回显
|
|
dictTextList: {
|
|
projectId_dictText: '', // 项目名
|
|
reviewType_dictText: '', // 回访方式
|
|
reviewTimeTamp: new Date().getTime(), // 回访时间
|
|
handleTimeTamp: new Date().getTime(), // 处理时间
|
|
reviewUserId_dictText: '', //回访人
|
|
resultStatus_dictText: '', //回访结果
|
|
inspectionResult_dictText: '', // 巡检结果
|
|
opinionType_dictText: '', // 意见分类
|
|
handleId_dictText: '', // 处理人
|
|
customerFollowTemplate_dictText: '', // 回访模板
|
|
inspectionTemplate_dictText: '', // 巡检模板
|
|
handleType_dictText: '' // 处理结果
|
|
},
|
|
projectList: [], // 项目数据
|
|
filterProjectList: [], // 过滤后项目数据
|
|
projectSearchVal: '', // 项目查询
|
|
userList: [], // 处理人数据
|
|
reviewUserList: [], // 回访人数据
|
|
filterUserList: [], // 过滤后处理人数据
|
|
filterReviewUserList: [], // 过滤后回访人数据
|
|
userSearchVal: '', // 项目查询
|
|
reviewUserSearchVal: '', // 项目查询
|
|
reviewTypeList: [], // 回访方式字典
|
|
resultStatusList: [], // 回访结果字典
|
|
opinionStatusList: [], // 回访结果字典(编辑状态用)
|
|
inspectionResultList: [], // 巡检结果字典
|
|
opinionTypeList: [], // 意见分类
|
|
baseInfoFileList: [], // 回访信息附件
|
|
inspectionTaskFileList: [], // 车辆巡检附件
|
|
opinionFileList: [], // 意见反馈附件
|
|
originVehicleList: [], // 项目所属车辆数据(原始数据,用于还原)
|
|
vehicleList: [], // 项目所属车辆数据
|
|
customerFollowTemplateList: [], // 客户回访模板数据
|
|
filterCustomerFollowTemplateList: [], // 过滤后客户回访模板数据
|
|
customerFollowTemplateSearchVal: '', // 回访模板查询
|
|
inspectionTemplateList: [], // 车辆巡检模板数据
|
|
filterInspectionTemplateList: [], // 过滤后车辆巡检模板数据
|
|
inspectionTemplateSearchVal: '', // 巡检模板查询
|
|
customerFollowTemplatePartList: [], // 修改格式后的回访模板
|
|
inspectionTemplatePartList: [], // 修改格式后的巡检模板
|
|
pleasedStatusList: [
|
|
{ text: '满意', value: '1' },
|
|
{ text: '不满意', value: '2' }
|
|
], // 满意度
|
|
currentIndex: {}, // 选中的满意度序号
|
|
// 必填校验
|
|
requireObj: {
|
|
baseInfo: {
|
|
projectId: '', // 项目id
|
|
reviewType: '', // 回访方式
|
|
reviewTime: '', // 回访时间
|
|
templateId: '', // 回访模板
|
|
reviewUserId: '', // 回访人
|
|
resultStatus: '' // 回访结果
|
|
},
|
|
inspectionTaskInfo: {
|
|
inspectionResult: '', // 巡检结果
|
|
inspectionTemplateId: '', // 巡检模板
|
|
handlePlan: '', // 处理方案
|
|
handleType: '', // 处理结果
|
|
handleTime: '' // 处理时间
|
|
},
|
|
opinionInfo: {
|
|
name: '', // 意见标题
|
|
opinionType: '', // 意见分类
|
|
proposeName: '', // 提议人
|
|
phone: '', // 联系电话
|
|
content: '', // 意见内容
|
|
handleId: '' // 处理人
|
|
}
|
|
},
|
|
// 非必填校验
|
|
validateObj: {
|
|
baseInfo: {
|
|
remark: '', // 备注
|
|
partList: [] // 模板备注
|
|
},
|
|
inspectionTaskInfo: {
|
|
remark: '',
|
|
partList: [], // 模板备注
|
|
vehicles: [] //车辆备注
|
|
},
|
|
opinionInfo: {
|
|
remark: ''
|
|
}
|
|
},
|
|
uploading: false // 文件是否上传中
|
|
},
|
|
// 展示和收起
|
|
showBoxInf(e: any) {
|
|
let data: any = { ...this.data };
|
|
let { fieldname } = e.currentTarget.dataset;
|
|
// let detail = e.detail;
|
|
data.showBox[fieldname] = !data.showBox[fieldname];
|
|
this.setData(data);
|
|
},
|
|
// 选择内容
|
|
selectContent(e: any) {
|
|
if (this.data.isEdit) return;
|
|
let data: any = { ...this.data };
|
|
let { fieldname } = e.currentTarget.dataset;
|
|
// let detail = e.detail;
|
|
data.contentItem[fieldname] = !data.contentItem[fieldname];
|
|
this.setData(data);
|
|
},
|
|
// 下拉选择/日期确认
|
|
pickerConfirm(event: any) {
|
|
//下拉框点击确认
|
|
let { fieldname, dicttext, type } = event.currentTarget.dataset;
|
|
let detail = event.detail;
|
|
let data: any = { ...this.data };
|
|
if (fieldname == 'reviewTime') {
|
|
data.params[fieldname] = dayjs(new Date(detail)).format(
|
|
'YYYY-MM-DD HH:mm:ss'
|
|
);
|
|
data.dictTextList.reviewTimeTamp = event.detail;
|
|
data.requireObj.baseInfo.reviewTime = '';
|
|
} else if (fieldname == 'handleTime') {
|
|
data.params.inspectionTask[fieldname] = dayjs(new Date(detail)).format(
|
|
'YYYY-MM-DD HH:mm:ss'
|
|
);
|
|
data.dictTextList.handleTimeTamp = event.detail;
|
|
data.requireObj.inspectionTaskInfo.handleTime = '';
|
|
} else {
|
|
// 基础信息
|
|
if (type) {
|
|
data.params[type][fieldname] = detail.value.value;
|
|
data.requireObj[type + 'Info'][fieldname] = '';
|
|
}
|
|
// 车辆巡检和意见反馈
|
|
else {
|
|
data.params[fieldname] = detail.value.value;
|
|
data.requireObj.baseInfo[fieldname] = '';
|
|
}
|
|
data.dictTextList[dicttext] = detail.value.text;
|
|
}
|
|
if (fieldname == 'inspectionResult') {
|
|
// 控制异常处理显隐
|
|
if (event.detail.value.value == '0') {
|
|
data.contentItem.handle = true;
|
|
} else {
|
|
data.contentItem.handle = false;
|
|
}
|
|
}
|
|
// 根据项目获取车辆
|
|
if (fieldname == 'projectId') {
|
|
this.getVehicle(detail.value.value);
|
|
}
|
|
// 获取回访模板数据
|
|
if (fieldname == 'templateId') {
|
|
data.customerFollowTemplatePartList = this.changeTemplate(
|
|
detail.value.partList,
|
|
'categoryName',
|
|
'followName',
|
|
'pleasedStatus'
|
|
);
|
|
data.validateObj.baseInfo.partList = [];
|
|
data.customerFollowTemplatePartList.forEach((item: any) => {
|
|
let arr: any = [];
|
|
for (let i = 0; i < item.length; i++) {
|
|
arr.push({ remark: '' });
|
|
}
|
|
data.validateObj.baseInfo.partList.push(arr);
|
|
});
|
|
}
|
|
// 获取巡检模板数据
|
|
else if (fieldname == 'inspectionTemplateId') {
|
|
data.inspectionTemplatePartList = this.changeTemplate(
|
|
detail.value.partList,
|
|
'name',
|
|
'content',
|
|
'normal'
|
|
);
|
|
data.validateObj.inspectionTaskInfo.partList = [];
|
|
data.inspectionTemplatePartList.forEach((item: any) => {
|
|
let arr: any = [];
|
|
for (let i = 0; i < item.length; i++) {
|
|
arr.push({ remark: '' });
|
|
}
|
|
data.validateObj.inspectionTaskInfo.partList.push(arr);
|
|
});
|
|
}
|
|
|
|
this.setData(data);
|
|
this.hidePicker();
|
|
},
|
|
// 选中满意度
|
|
pleasedStatusPickerConfirm(event: any) {
|
|
let data: any = this.data;
|
|
data.customerFollowTemplatePartList[data.currentIndex.index][
|
|
data.currentIndex.idx
|
|
].pleasedStatus = event.detail.value.value;
|
|
this.setData(data);
|
|
this.hidePicker();
|
|
},
|
|
// 是否正常单选
|
|
templateOnChange(event: any) {
|
|
let { index, idx } = event.currentTarget.dataset;
|
|
let data: any = this.data;
|
|
data.inspectionTemplatePartList[index][idx].normal = event.detail;
|
|
this.setData(data);
|
|
},
|
|
// 巡检车辆结果单选
|
|
vehicleOnChange(event: any) {
|
|
let { index } = event.currentTarget.dataset;
|
|
let data: any = this.data;
|
|
data.vehicleList[index].isNormal = event.detail;
|
|
this.setData(data);
|
|
},
|
|
// 车辆异常备注
|
|
vehicleRemarkChange(event: any) {
|
|
let { index } = event.currentTarget.dataset;
|
|
let data: any = this.data;
|
|
data.vehicleList[index].abnormalMsg = event.detail.value;
|
|
let regex = /[!@#$%^&*?><|\\\\]/;
|
|
let spaceRegex = new RegExp(/\s+/g);
|
|
let message = '';
|
|
// 有填写内容,校验特殊字符
|
|
if (event.detail.value) {
|
|
if (regex.test(event.detail.value)) {
|
|
message = '不支持特殊字符';
|
|
} else if (spaceRegex.test(event.detail.value))
|
|
message = '不支持含有空格';
|
|
else if (event.detail.value.length > 200)
|
|
message = '输入长度不得超过200个字符';
|
|
}
|
|
data.validateObj.inspectionTaskInfo.vehicles[index].remark = message;
|
|
this.setData(data);
|
|
},
|
|
// 删除车辆
|
|
deleteVehicle(event: any) {
|
|
let { index } = event.currentTarget.dataset;
|
|
let data: any = this.data;
|
|
data.vehicleList.splice(index, 1);
|
|
data.validateObj.inspectionTaskInfo.vehicles.splice(index, 1);
|
|
this.setData(data);
|
|
},
|
|
// 重置车辆
|
|
resetVehicle() {
|
|
let data: any = this.data;
|
|
// 将删除的数据恢复
|
|
data.originVehicleList.forEach((item: any, index: number) => {
|
|
let res = data.vehicleList.some((el: any) => {
|
|
return el.vehicleId == item.vehicleId;
|
|
});
|
|
if (!res) {
|
|
data.vehicleList.splice(index, 0, item);
|
|
data.validateObj.inspectionTaskInfo.vehicles.splice(index, 0, {
|
|
remark: ''
|
|
});
|
|
}
|
|
});
|
|
this.setData(data);
|
|
},
|
|
// 模板数据格式修改(提交改为编辑)
|
|
changeTemplate(data: any, name: string, childNmae: string, status: string) {
|
|
let arr = [] as any;
|
|
if (data.length > 0) {
|
|
data.forEach((item: any) => {
|
|
let res = {
|
|
[name]: item[name],
|
|
[childNmae]: item[childNmae],
|
|
[status]: this.data.isEdit ? item[status] : '1',
|
|
remark: this.data.isEdit ? item.remark : ''
|
|
};
|
|
// 没数据时,放第一位
|
|
if (arr.length == 0) {
|
|
arr.push([res]);
|
|
}
|
|
// 按某个字段分类模板
|
|
else {
|
|
let result = false;
|
|
for (const el of arr) {
|
|
// 存在相同数据
|
|
if (el[0][name] == item[name]) {
|
|
el.push(res);
|
|
result = true;
|
|
break;
|
|
}
|
|
}
|
|
// 存在不同
|
|
if (!result) {
|
|
arr.push([res]);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
return arr;
|
|
},
|
|
// 模板数据格式修改(编辑改为提交)
|
|
changeTemplate2(data: any) {
|
|
let arr: any = [];
|
|
|
|
return arr;
|
|
},
|
|
// 项目过滤
|
|
filterProject(event: any) {
|
|
let list = [] as any;
|
|
this.data.projectList.forEach((item: any) => {
|
|
if (item.text.toLowerCase().indexOf(event.detail.toLowerCase()) >= 0) {
|
|
list.push(item);
|
|
}
|
|
});
|
|
this.setData({
|
|
filterProjectList: list,
|
|
projectSearchVal: event.detail
|
|
});
|
|
},
|
|
// 处理人过滤
|
|
filterUser(event: any) {
|
|
let list = [] as any;
|
|
this.data.userList.forEach((item: any) => {
|
|
if (item.text.toLowerCase().indexOf(event.detail.toLowerCase()) >= 0) {
|
|
list.push(item);
|
|
}
|
|
});
|
|
this.setData({
|
|
filterUserList: list,
|
|
userSearchVal: event.detail
|
|
});
|
|
},
|
|
// 回访人过滤
|
|
filterReviewUser(event: any) {
|
|
let list = [] as any;
|
|
this.data.reviewUserList.forEach((item: any) => {
|
|
if (item.text.toLowerCase().indexOf(event.detail.toLowerCase()) >= 0) {
|
|
list.push(item);
|
|
}
|
|
});
|
|
this.setData({
|
|
filterReviewUserList: list,
|
|
reviewUserSearchVal: event.detail
|
|
});
|
|
},
|
|
// 回访模板过滤
|
|
filterCustomerFollowTemplate(event: any) {
|
|
let list = [] as any;
|
|
this.data.customerFollowTemplateList.forEach((item: any) => {
|
|
if (item.text.toLowerCase().indexOf(event.detail.toLowerCase()) >= 0) {
|
|
list.push(item);
|
|
}
|
|
});
|
|
this.setData({
|
|
filterCustomerFollowTemplateList: list,
|
|
customerFollowTemplateSearchVal: event.detail
|
|
});
|
|
},
|
|
//下拉框切换是否展示
|
|
pickerChange(event: any) {
|
|
let { fieldname, index, idx } = event.currentTarget.dataset;
|
|
let data: any = { ...this.data };
|
|
data.showList[fieldname] = true;
|
|
// 选中的是满意度
|
|
if (fieldname == 'pleasedStatusShow') {
|
|
let currentIndex = {
|
|
index,
|
|
idx
|
|
};
|
|
data.currentIndex = currentIndex;
|
|
}
|
|
this.setData(data);
|
|
},
|
|
// 关闭下拉选择/日期选择
|
|
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, texttype } = event.currentTarget.dataset;
|
|
let data: any = this.data;
|
|
let result = event.detail.value;
|
|
let regex = /[!@#$%^&*?><|\\\\]/;
|
|
let phoneRegex = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
|
|
let spaceRegex = new RegExp(/\s+/g);
|
|
let message = '';
|
|
// 有填写内容,校验特殊字符
|
|
if (result && regex.test(result)) {
|
|
message = '不支持特殊字符';
|
|
} else if (spaceRegex.test(result)) message = '不支持含有空格';
|
|
else if (texttype != 'textarea' && result.length > 32)
|
|
message = '输入长度不得超过32个字符';
|
|
else if (texttype == 'textarea' && result.length > 500)
|
|
message = '输入长度不得超过500个字符';
|
|
else if (result && fieldname == 'phone' && !phoneRegex.test(result)) {
|
|
message = '联系电话格式错误';
|
|
}
|
|
// 没有填写内容且不为必填
|
|
else if (!result && require != 'norequire') {
|
|
message = '请填写必填项';
|
|
} else if (result) {
|
|
message = '';
|
|
}
|
|
if (type) {
|
|
data.params[type][fieldname] = result;
|
|
} else {
|
|
data.params[fieldname] = result;
|
|
}
|
|
if (type) {
|
|
if (
|
|
Object.prototype.hasOwnProperty.call(
|
|
data.requireObj[type + 'Info'],
|
|
fieldname
|
|
)
|
|
)
|
|
data.requireObj[type + 'Info'][fieldname] = message;
|
|
if (
|
|
Object.prototype.hasOwnProperty.call(
|
|
data.validateObj[type + 'Info'],
|
|
fieldname
|
|
)
|
|
)
|
|
data.validateObj[type + 'Info'][fieldname] = message;
|
|
} else {
|
|
if (
|
|
Object.prototype.hasOwnProperty.call(
|
|
data.requireObj.baseInfo,
|
|
fieldname
|
|
)
|
|
)
|
|
data.requireObj.baseInfo[fieldname] = message;
|
|
if (
|
|
Object.prototype.hasOwnProperty.call(
|
|
data.validateObj.baseInfo,
|
|
fieldname
|
|
)
|
|
)
|
|
data.validateObj.baseInfo[fieldname] = message;
|
|
}
|
|
this.setData(data);
|
|
},
|
|
// 模板备注输入
|
|
partListRemarkChange(event: any) {
|
|
let { fieldname, index, idx } = event.currentTarget.dataset;
|
|
// let idx = event.currentTarget.dataset.index
|
|
let data: any = this.data;
|
|
data[fieldname][index][idx].remark = event.detail.value;
|
|
let message = '';
|
|
if (event.detail.value) {
|
|
let regex = /[!@#$%^&*?><|\\\\]/;
|
|
let spaceRegex = new RegExp(/\s+/g);
|
|
if (regex.test(event.detail.value)) message = '不支持特殊字符';
|
|
else if (spaceRegex.test(event.detail.value)) message = '不支持含有空格';
|
|
else if (event.detail.value.length > 200)
|
|
message = '输入长度不得超过200个字符';
|
|
} else message = '';
|
|
if (fieldname == 'customerFollowTemplatePartList')
|
|
data.validateObj.baseInfo.partList[index][idx].remark = message;
|
|
if (fieldname == 'inspectionTemplatePartList')
|
|
data.validateObj.inspectionTaskInfo.partList[index][idx].remark = message;
|
|
this.setData(data);
|
|
},
|
|
// 文件上传
|
|
fileAfterRead(event: any) {
|
|
const file = event.detail;
|
|
let index: any = event.detail.index;
|
|
let { list, type } = event.currentTarget.dataset;
|
|
let data: any = this.data;
|
|
let option = {
|
|
name: 'file',
|
|
filePath: event.detail.file.url
|
|
};
|
|
data[list][index] = {
|
|
status: 'uploading',
|
|
message: '上传中'
|
|
};
|
|
data.uploading = true;
|
|
this.setData(data);
|
|
upload('api/customerFollow/upload', option)
|
|
.then((res: any) => {
|
|
let tempData = JSON.parse(res.data);
|
|
if (!tempData.success) {
|
|
wx.showToast({
|
|
title: tempData.message,
|
|
icon: 'none'
|
|
});
|
|
data[list][index] = {
|
|
status: 'failed',
|
|
message: '上传失败'
|
|
};
|
|
data.uploading = false;
|
|
this.setData(data);
|
|
return;
|
|
}
|
|
data[list][index] = {
|
|
...file,
|
|
url: tempData.message,
|
|
status: 'done',
|
|
message: '上传完成'
|
|
};
|
|
console.log(data[list]);
|
|
|
|
data.uploading = false;
|
|
// 地址拼接
|
|
let fileUrl;
|
|
if (type) {
|
|
fileUrl = data.params[type].fileUrl
|
|
? data.params[type].fileUrl + ',' + tempData.message
|
|
: tempData.message;
|
|
data.params[type].fileUrl = fileUrl;
|
|
} else {
|
|
fileUrl = data.params.fileUrl
|
|
? data.params.fileUrl + ',' + tempData.message
|
|
: tempData.message;
|
|
data.params.fileUrl = fileUrl;
|
|
}
|
|
this.setData(data);
|
|
})
|
|
.catch(err => {
|
|
data.uploading = false;
|
|
});
|
|
},
|
|
// 删除文件
|
|
deleteFile(event: any) {
|
|
let { list, type } = event.currentTarget.dataset;
|
|
let data: any = this.data;
|
|
let index = event.detail.index;
|
|
data[list].splice(index, 1);
|
|
if (data.params[type]?.fileUrl) {
|
|
data.params[type].fileUrl = data[list]
|
|
.map((item: any) => {
|
|
return item.url;
|
|
})
|
|
.join(',');
|
|
} else if (data.params.fileUrl) {
|
|
data.params.fileUrl = data[list]
|
|
.map((item: any) => {
|
|
return item.url;
|
|
})
|
|
.join(',');
|
|
}
|
|
this.setData(data);
|
|
},
|
|
// 校验
|
|
validateFn() {
|
|
let data: any = this.data;
|
|
let result = true;
|
|
// 校验基础信息和回访信息
|
|
let baseInfoKeys = Object.keys(data.requireObj.baseInfo);
|
|
baseInfoKeys.forEach((item: any) => {
|
|
if (data.requireObj.baseInfo[item]) result = false;
|
|
if (!data.params[item]) {
|
|
data.requireObj.baseInfo[item] = '请填写必填项';
|
|
result = false;
|
|
}
|
|
});
|
|
// 校验车辆巡检
|
|
if (data.contentItem.inspectionTask) {
|
|
let inspectionTaskKeys = Object.keys(data.requireObj.inspectionTaskInfo);
|
|
inspectionTaskKeys.forEach((item: any) => {
|
|
// 没有填写异常处理
|
|
if (
|
|
!data.contentItem.handle &&
|
|
(item == 'handlePlan' || item == 'handleType' || item == 'handleTime')
|
|
)
|
|
return;
|
|
if (data.requireObj.inspectionTaskInfo[item]) result = false;
|
|
if (!data.params.inspectionTask[item]) {
|
|
data.requireObj.inspectionTaskInfo[item] = '请填写必填项';
|
|
result = false;
|
|
return;
|
|
}
|
|
// 处理方案
|
|
if (data.contentItem.handle && item == 'handlePlan') {
|
|
let regex = /[!@#$%^&*?><|\\\\]/;
|
|
let spaceRegex = new RegExp(/\s+/g);
|
|
let message = '';
|
|
// 有填写内容,校验特殊字符
|
|
if (result && regex.test(data.params.inspectionTask[item])) {
|
|
message = '不支持特殊字符';
|
|
result = false;
|
|
} else if (spaceRegex.test(data.params.inspectionTask[item])) {
|
|
message = '不支持含有空格';
|
|
result = false;
|
|
} else if (data.params.inspectionTask[item].length > 500) {
|
|
message = '输入长度不得超过500个字符';
|
|
result = false;
|
|
}
|
|
data.requireObj.inspectionTaskInfo[item] = message;
|
|
}
|
|
});
|
|
}
|
|
// 校验意见反馈
|
|
if (data.contentItem.opinion) {
|
|
let opinionKeys = Object.keys(data.requireObj.opinionInfo);
|
|
opinionKeys.forEach((item: any) => {
|
|
if (data.requireObj.opinionInfo[item]) result = false;
|
|
if (!data.params.opinion[item]) {
|
|
data.requireObj.opinionInfo[item] = '请填写必填项';
|
|
result = false;
|
|
}
|
|
});
|
|
}
|
|
// 校验非必填特殊字符
|
|
if (
|
|
data.validateObj.baseInfo.remark ||
|
|
data.validateObj.inspectionTaskInfo.remark ||
|
|
data.validateObj.opinionInfo.remark
|
|
)
|
|
result = false;
|
|
// 模板校验
|
|
for (const item of data.validateObj.baseInfo.partList) {
|
|
let res = item.some((el: any) => {
|
|
return el.remark !== '';
|
|
});
|
|
if (res) {
|
|
result = false;
|
|
break;
|
|
}
|
|
}
|
|
for (const item of data.validateObj.inspectionTaskInfo.partList) {
|
|
let res = item.some((el: any) => {
|
|
return el.remark !== '';
|
|
});
|
|
if (res) {
|
|
result = false;
|
|
break;
|
|
}
|
|
}
|
|
// 车辆校验
|
|
for (const item of data.validateObj.inspectionTaskInfo.vehicles) {
|
|
if (item.remark != '') {
|
|
result = false;
|
|
break;
|
|
}
|
|
}
|
|
this.setData(data);
|
|
return result;
|
|
},
|
|
// 校验文件
|
|
checkFile() {
|
|
let { baseInfoFileList, inspectionTaskFileList, opinionFileList } =
|
|
this.data;
|
|
let result = true;
|
|
if (
|
|
baseInfoFileList &&
|
|
baseInfoFileList.some((item: any) => {
|
|
return item.status == 'failed';
|
|
})
|
|
)
|
|
result = false;
|
|
if (
|
|
inspectionTaskFileList &&
|
|
inspectionTaskFileList.some((item: any) => {
|
|
return item.status == 'failed';
|
|
})
|
|
)
|
|
result = false;
|
|
if (
|
|
opinionFileList &&
|
|
opinionFileList.some((item: any) => {
|
|
return item.status == 'failed';
|
|
})
|
|
)
|
|
result = false;
|
|
return result;
|
|
},
|
|
// 提交
|
|
formSubmit() {
|
|
// 防止重复提交
|
|
if (this.data.isSubmit) return;
|
|
// 校验
|
|
if (!this.validateFn()) return;
|
|
// 校验文件是否正在上传
|
|
if (this.data.uploading) {
|
|
wx.showToast({
|
|
title: '文件上传中,请稍后',
|
|
icon: 'none'
|
|
});
|
|
return;
|
|
}
|
|
// 校验是否有错误文件
|
|
if (!this.checkFile()) {
|
|
wx.showToast({
|
|
title: '请删除错误文件',
|
|
icon: 'none'
|
|
});
|
|
return;
|
|
}
|
|
let params: any = JSON.parse(JSON.stringify(this.data.params));
|
|
// 回访模板
|
|
params.partList = [].concat(...this.data.customerFollowTemplatePartList);
|
|
// 有勾选车辆巡检
|
|
if (this.data.contentItem.inspectionTask) {
|
|
// 巡检模板
|
|
params.inspectionTask.partList = [].concat(
|
|
...this.data.inspectionTemplatePartList
|
|
);
|
|
// 车辆信息
|
|
params.inspectionTask.vehicles = this.data.vehicleList;
|
|
params.inspectionTask.attachment = params.inspectionTask.fileUrl;
|
|
delete params.inspectionTask.fileUrl;
|
|
} else {
|
|
delete params.inspectionTask;
|
|
}
|
|
// 没有有勾选意见反馈
|
|
if (!this.data.contentItem.opinion) {
|
|
delete params.opinion;
|
|
}
|
|
// 没有填写异常处理
|
|
if (!this.data.contentItem.handle && params.inspectionTask) {
|
|
params.inspectionTask.handlePlan = '';
|
|
params.inspectionTask.handleType = '';
|
|
params.inspectionTask.handleTime = '';
|
|
}
|
|
wx.showLoading({
|
|
title: '加载中'
|
|
});
|
|
this.setData({
|
|
isSubmit: true
|
|
});
|
|
let url, action;
|
|
// 编辑
|
|
if (this.data.isEdit) {
|
|
url = 'api/customerFollow/edit';
|
|
action = putAction;
|
|
}
|
|
// 新增
|
|
else {
|
|
url = 'api/customerFollow/add';
|
|
action = postAction;
|
|
delete params.id;
|
|
}
|
|
action(url, params)
|
|
.then((res: any) => {
|
|
wx.hideLoading();
|
|
if (res.code == 200) {
|
|
wx.showToast({
|
|
title: '提交成功',
|
|
icon: 'success'
|
|
});
|
|
if (this.data.isEdit) {
|
|
setTimeout(() => {
|
|
wx.navigateTo({
|
|
url: '../../../pages/backlog/backlogFeedback/backlogFeedback',
|
|
fail: e => {
|
|
console.log(e);
|
|
}
|
|
});
|
|
this.setData({
|
|
isSubmit: false
|
|
});
|
|
wx.hideToast();
|
|
}, 1000);
|
|
} else {
|
|
setTimeout(() => {
|
|
wx.navigateBack({
|
|
delta: 1
|
|
});
|
|
this.setData({
|
|
isSubmit: false
|
|
});
|
|
wx.hideToast();
|
|
}, 1000);
|
|
}
|
|
} else {
|
|
wx.showToast({
|
|
title: res.message,
|
|
icon: 'none'
|
|
});
|
|
this.setData({
|
|
isSubmit: false
|
|
});
|
|
}
|
|
})
|
|
.catch(err => {
|
|
console.log(err);
|
|
this.setData({
|
|
isSubmit: false
|
|
});
|
|
});
|
|
},
|
|
// 获取项目
|
|
getProjectOptions() {
|
|
getAction('api/projects/list').then((res: any) => {
|
|
if (res.code == 200) {
|
|
let arr = [] as any;
|
|
res.result.forEach((item: any, index: number) => {
|
|
arr.push({
|
|
text: item.projectName,
|
|
value: item.id
|
|
});
|
|
});
|
|
this.setData({
|
|
projectList: arr,
|
|
filterProjectList: arr
|
|
});
|
|
} else {
|
|
wx.showToast({
|
|
title: res.message,
|
|
icon: 'none'
|
|
});
|
|
}
|
|
});
|
|
},
|
|
// 获取用户
|
|
getUser() {
|
|
getAction('api/sys/user/list?pageSize=-1&pageNo=1').then((res: any) => {
|
|
if (res.success) {
|
|
let arr = [] as any;
|
|
res.result.records.forEach((item: any, index: number) => {
|
|
arr.push({
|
|
text: item.realname,
|
|
value: item.id
|
|
});
|
|
});
|
|
this.setData({
|
|
userList: arr,
|
|
reviewUserList: arr,
|
|
filterUserList: arr,
|
|
filterReviewUserList: arr
|
|
});
|
|
} else {
|
|
wx.showToast({
|
|
title: res.message,
|
|
icon: 'none'
|
|
});
|
|
}
|
|
});
|
|
},
|
|
// 获取客户回访模板
|
|
getCustomerFollowTemplate() {
|
|
getAction('api/customerFollowTemplate/list?pageNo=1&pageSize=-1').then(
|
|
(res: any) => {
|
|
if (res.success) {
|
|
let arr = [] as any;
|
|
res.result.records.forEach((item: any, index: number) => {
|
|
arr.push({
|
|
text: item.name,
|
|
value: item.id,
|
|
partList: item.partList
|
|
});
|
|
});
|
|
this.setData({
|
|
customerFollowTemplateList: arr,
|
|
filterCustomerFollowTemplateList: arr
|
|
});
|
|
} else {
|
|
wx.showToast({
|
|
title: res.message,
|
|
icon: 'none'
|
|
});
|
|
}
|
|
}
|
|
);
|
|
},
|
|
// 获取巡检模板模板
|
|
getInspectionTemplate() {
|
|
getAction('api/inspectionTemplate/list?pageNo=1&pageSize=-1').then(
|
|
(res: any) => {
|
|
if (res.success) {
|
|
let arr = [] as any;
|
|
res.result.records.forEach((item: any, index: number) => {
|
|
arr.push({
|
|
text: item.name,
|
|
value: item.id,
|
|
partList: item.projectList
|
|
});
|
|
});
|
|
this.setData({
|
|
inspectionTemplateList: arr,
|
|
filterInspectionTemplateList: arr
|
|
});
|
|
} else {
|
|
wx.showToast({
|
|
title: res.message,
|
|
icon: 'none'
|
|
});
|
|
}
|
|
}
|
|
);
|
|
},
|
|
// 获取车辆数据
|
|
getVehicle(projectId: any) {
|
|
getAction(
|
|
`api/vehicle/listByProjectId?pageSize=-1&pageNo=1&projectId=${projectId}`
|
|
).then((res: any) => {
|
|
if (res.success) {
|
|
let arr: any = [];
|
|
let validate: any = [];
|
|
let data: any = this.data;
|
|
res.result.forEach((item: any) => {
|
|
arr.push({
|
|
vehicleId: item.id,
|
|
plateNumber: item.plateNumber,
|
|
isNormal: '1',
|
|
abnormalMsg: ''
|
|
});
|
|
validate.push({ remark: '' });
|
|
});
|
|
data.vehicleList = JSON.parse(JSON.stringify(arr));
|
|
data.originVehicleList = JSON.parse(JSON.stringify(arr));
|
|
data.validateObj.inspectionTaskInfo.vehicles = validate;
|
|
this.setData({
|
|
vehicleList: arr,
|
|
originVehicleList: JSON.parse(JSON.stringify(arr))
|
|
});
|
|
} else {
|
|
wx.showToast({
|
|
title: res.message,
|
|
icon: 'none'
|
|
});
|
|
}
|
|
});
|
|
},
|
|
// 获取字典
|
|
getDict() {
|
|
getAction('api/sys/dict/queryAllDictItems').then((res: any) => {
|
|
let result: any = res.result;
|
|
this.setData({
|
|
reviewTypeList: result.review_type, // 回访方式
|
|
resultStatusList: result.result_status, // 回访结果
|
|
opinionStatusList: result.opinion_status, // 回访结果(编辑状态用)
|
|
inspectionResultList: result.inspection_result, // 巡检结果
|
|
opinionTypeList: result.opinion_type // 意见分类
|
|
});
|
|
});
|
|
},
|
|
getInf() {
|
|
let info = wx.getStorageSync('customerFollowData');
|
|
let data: any = this.data;
|
|
wx.removeStorageSync('customerFollowData');
|
|
if (info) {
|
|
getAction(`api/vehicles/backlog/getFollowInfoById?id=${info}`).then(
|
|
(res: any) => {
|
|
let result: any = res.result;
|
|
// 编辑模式
|
|
data.isEdit = true;
|
|
// 勾选
|
|
if (result.inspectionTask) data.contentItem.inspectionTask = true;
|
|
if (result.opinion) data.contentItem.opinion = true;
|
|
// 基本信息和回访信息
|
|
for (const key in data.params) {
|
|
if (
|
|
key != 'inspectionTask' &&
|
|
key != 'opinion' &&
|
|
key != 'partList'
|
|
) {
|
|
data.params[key] = result[key];
|
|
}
|
|
}
|
|
// 翻译
|
|
data.dictTextList.projectId_dictText = result.projectId_dictText;
|
|
data.dictTextList.reviewType_dictText = result.reviewType_dictText;
|
|
data.dictTextList.reviewUserId_dictText =
|
|
result.reviewUserId_dictText;
|
|
data.dictTextList.resultStatus_dictText =
|
|
result.resultStatus_dictText;
|
|
data.dictTextList.customerFollowTemplate_dictText =
|
|
result.templateId_dictText;
|
|
// 如果回访结果是未开始,清空
|
|
if (result.resultStatus === '0') {
|
|
data.params.resultStatus = '';
|
|
data.dictTextList.resultStatus_dictText = '';
|
|
}
|
|
// 回访模板
|
|
data.customerFollowTemplatePartList = this.changeTemplate(
|
|
result.partList,
|
|
'categoryName',
|
|
'followName',
|
|
'pleasedStatus'
|
|
);
|
|
// 回访模板校验
|
|
data.validateObj.baseInfo.partList = [];
|
|
data.customerFollowTemplatePartList.forEach((item: any) => {
|
|
let arr: any = [];
|
|
for (let i = 0; i < item.length; i++) {
|
|
arr.push({ remark: '' });
|
|
}
|
|
data.validateObj.baseInfo.partList.push(arr);
|
|
});
|
|
// 回访附件
|
|
data.baseInfoFileList = this.changeUrl(result.fileUrl);
|
|
// 车辆巡检
|
|
if (result.inspectionTask) {
|
|
for (const key in data.params.inspectionTask) {
|
|
data.params.inspectionTask[key] = result.inspectionTask[key];
|
|
}
|
|
// 巡检附件
|
|
data.inspectionTaskFileList = this.changeUrl(
|
|
result.inspectionTask.attachment
|
|
);
|
|
// 翻译
|
|
data.dictTextList.inspectionTemplate_dictText =
|
|
result.inspectionTask.inspectionTemplateId_dictText;
|
|
data.dictTextList.inspectionResult_dictText =
|
|
result.inspectionTask.inspectionResult_dictText;
|
|
// 车辆数据
|
|
data.vehicleList = result.inspectionTask.vehicleList;
|
|
// 巡检模板
|
|
data.inspectionTemplatePartList = this.changeTemplate(
|
|
result.inspectionTask.partList,
|
|
'name',
|
|
'content',
|
|
'normal'
|
|
);
|
|
// 异常处理
|
|
if (result.inspectionTask.inspectionResult === '0')
|
|
data.contentItem.handle = true;
|
|
data.dictTextList.handleType_dictText =
|
|
result.inspectionTask.handleType_dictText;
|
|
}
|
|
// 意见反馈
|
|
if (result.opinion) {
|
|
for (const key in data.params.opinion) {
|
|
data.params.opinion[key] = result.opinion[key];
|
|
}
|
|
// 反馈附件
|
|
data.opinionFileList = this.changeUrl(result.opinion.fileUrl);
|
|
// 翻译
|
|
data.dictTextList.opinionType_dictText =
|
|
result.opinion.opinionType_dictText;
|
|
data.dictTextList.handleId_dictText =
|
|
result.opinion.handleId_dictText;
|
|
}
|
|
this.setData(data);
|
|
}
|
|
);
|
|
}
|
|
},
|
|
// 附件翻译
|
|
changeUrl(data: any) {
|
|
if (!data) return;
|
|
let urls = data.split(',');
|
|
let result = [] as any;
|
|
urls.forEach((item: any, index: number) => {
|
|
result.push({
|
|
index: index,
|
|
message: '上传完成',
|
|
name: '',
|
|
status: 'done',
|
|
url: item,
|
|
file: {
|
|
url: item
|
|
}
|
|
});
|
|
});
|
|
return result;
|
|
},
|
|
/**
|
|
* 生命周期函数--监听页面加载
|
|
*/
|
|
onLoad() {
|
|
this.getProjectOptions();
|
|
this.getUser();
|
|
this.getCustomerFollowTemplate();
|
|
this.getInspectionTemplate();
|
|
this.getDict();
|
|
this.getInf();
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面初次渲染完成
|
|
*/
|
|
onReady() {},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面显示
|
|
*/
|
|
onShow() {},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面隐藏
|
|
*/
|
|
onHide() {},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面卸载
|
|
*/
|
|
onUnload() {},
|
|
|
|
/**
|
|
* 页面相关事件处理函数--监听用户下拉动作
|
|
*/
|
|
onPullDownRefresh() {},
|
|
|
|
/**
|
|
* 页面上拉触底事件的处理函数
|
|
*/
|
|
onReachBottom() {},
|
|
|
|
/**
|
|
* 用户点击右上角分享
|
|
*/
|
|
onShareAppMessage() {}
|
|
});
|