人物画像

This commit is contained in:
liuxi 2025-01-09 18:15:14 +08:00
parent ae07857972
commit 5436b5ade0
6 changed files with 476 additions and 244 deletions

View File

@ -401,7 +401,7 @@ import { values } from "lodash";
//
PartCaseStatusEnum:[{label:'待分案',value:false},{label:'已分案',value:true}],
//
MediateProgEnum:[{label:'承诺账户',value:'承诺账户'},{label:'重点账户',value:'重点账户'},{label:'已结清客户',value:'已结清客户'},
MediateProgEnum:[{label:'承诺账户',value:'承诺账户'},{label:'重点账户',value:'重点账户'},{label:'拒联账户',value:'拒联账户'},{label:'已结清客户',value:'已结清客户'},
{label:'疑难账户',value:'疑难账户'},{label:'失联账户',value:'失联账户'},{label:'半失联账户',value:'半失联账户'},{label:'部分还款账户',value:'部分还款账户'},
{label:'适诉案件',value:'适诉案件'},{label:'可联账户',value:'可联账户'},{label:'投诉倾向客户',value:'投诉倾向客户'},{label:'分期客户',value:'分期客户'},
{label:'其他/无标签',value:'其他/无标签'}

View File

@ -345,14 +345,16 @@
<div class="line-height-30 f22 f-weight600">沟通记录</div>
<div class="flex-row justify-content-between align-items-center pt-16 pb-16">
<el-select v-model="communicationRecord" placeholder="请选择">
<el-option label="111" value="222"></el-option>
<el-select v-model="mediaterecordpm.linkedWay" placeholder="请选择" @change="getmediate_record">
<el-option label="全部沟通" value=""></el-option>
<el-option label="电话沟通" value="1"></el-option>
<el-option label="视频沟通" value="2"></el-option>
</el-select>
<el-button plain icon="el-icon-plus" @click="visiblemediatRecord = true">新增沟通记录</el-button>
</div>
<el-timeline class="padding-0">
<el-timeline-item timestamp="2018/4/12" placement="top" type="primary">
<el-timeline-item v-for="(item,index) in communicationRecord" :key="index" :timestamp="item.recordDate" placement="top" type="primary">
<el-card shadow="never">
<div class="flex-row justify-content-between timeline-layout">
<div class="timeline-layout-w">
@ -538,7 +540,7 @@
</div>
<caseVideoReservationDialog v-if="visiblePopover" :visible-popover.sync="visiblePopover" />
<MediationRecordDialog v-if="visiblemediatRecord" :visiblemediatRecord.sync="visiblemediatRecord" />
<MediationRecordDialog v-if="visiblemediatRecord" :caseId="caseId" :visiblemediatRecord.sync="visiblemediatRecord" />
<!-- 视频房间 -->
<VideoRoom v-if="VideoCallDialog" :eventDialog.sync="VideoCallDialog" />
</div>
@ -636,10 +638,14 @@ export default {
],
},
communicationRecord: '',
communicationRecord: [],
visiblePopover: null,
VideoCallDialog: null,
mediaterecordpm:{
caseId:this.$route.query.caseId,
linkedWay:undefined
},
};
},
computed: {
@ -665,7 +671,8 @@ export default {
},
async created() {
this.caseId = this.$route.query.caseId
await this.getCaseInfoById();//
this.getCaseInfoById();//
this.getmediate_record()
},
beforeDestroy() {
// if(this.timer) { //
@ -689,9 +696,9 @@ export default {
return {cardNo: datacardno.substring(0, len), phone: dataphone.substring(0, len)};
},
//
async getCaseInfoById() {
getCaseInfoById() {
let _that = this
await api.getCaseInfoById(this.caseId).then(res => {
api.getCaseInfoById(this.caseId).then(res => {
if (!res.code) {
this.baseInfo = res
//
@ -701,9 +708,7 @@ export default {
caseFileEntityList.push({name: item.name, fileName: item.name, url: item.url})
})
_that.fileList = caseFileEntityList
}
})
},
//
@ -729,39 +734,18 @@ export default {
}
})
},
//
handleDownloadMediationTemplate() {
if (!this.$clickThrottle()) {
return
}//
// console.log('url',templateUrl)
if (this.templateUrl) {
this.handlePreview({previewUrl: "/mediate/minio/preview/" + this.templateUrl, url: this.templateUrl})
} else {
this.$message({message: '当前案件未存在调解模板', type: "warning", customClass: 'messageZindex'})
}
},
async handlePreview(item) {
try {
let res = await this.$fetchApi.getMinioToken({objectName: item.url})
window.open(`${item.previewUrl}?token=${res}`, '_target')
} catch (e) {
this.$message.error(e.msg || e)
}
},
handleSubmitRepayment() {
this.$refs.ruleFormRepayment.validate((valid) => {
if (valid) {
console.log(1111)
}
})
},
handleBack() {
// this.$route.query.sourcePage == 'mediationManagement'
this.$router.push('/mediation-management')
},
//
getmediate_record() {
api.mediate_record_list(this.mediaterecordpm).then(res => {
if (!res.code) {
this.communicationRecord = res
}
})
},
}
};
</script>

View File

@ -4,60 +4,75 @@
:modal="false" width="880px" append-to-body :close-on-click-modal="false"
@close="handleClose" v-drag>
<div class="dialog-content dialog-mr-batch">
<div class="p-24">
<div class="p-16">
<div class="flex-column">
<span class="f16 f-weight500">沟通类型</span>
<div class="mt-16">
<el-radio-group v-model="mrObj.radio">
<el-radio :label="3">电话</el-radio>
<el-radio :label="6">视频</el-radio>
<div class="mt-8">
<el-radio-group v-model="mrObj.linkedWay">
<el-radio :label="1">电话</el-radio>
<el-radio :label="2">视频</el-radio>
<el-radio :label="3">视频</el-radio>
</el-radio-group>
</div>
<span class="f16 f-weight500 mt-16">电话情况</span>
<div class="mt-16">
<el-radio-group v-model="mrObj.radio">
<el-radio :label="3">已接</el-radio>
<el-radio :label="6">未接</el-radio>
<el-radio :label="9">拒接</el-radio>
<el-radio :label="9">关机</el-radio>
<el-radio :label="9">空号</el-radio>
<el-radio :label="9">停机</el-radio>
<span class="f16 f-weight500 mt-8">沟通时间</span>
<div class="mt-8 flex-row">
<el-date-picker size="small" style="width: 200px;"
:clearable="false"
v-model="mrObj.linkedTime"
type="datetime"
placeholder="选择沟通时间"
value-format="yyyy-MM-dd HH:mm:ss"
format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
<!-- <el-date-picker
v-model="value1"
type="datetime"
placeholder="选择日期时间">
</el-date-picker> -->
</div>
<span class="f16 f-weight500 mt-8">电话情况</span>
<div class="mt-8">
<el-radio-group v-model="mrObj.linkedSituation">
<el-radio :label="0">已接</el-radio>
<el-radio :label="1">未接</el-radio>
<el-radio :label="2">拒接</el-radio>
<el-radio :label="3">关机</el-radio>
<el-radio :label="8">空号</el-radio>
<el-radio :label="4">停机</el-radio>
<el-radio :label="9">设置</el-radio>
<el-radio :label="9">正在通话中</el-radio>
<el-radio :label="9">暂时无法接通</el-radio>
<el-radio :label="10">正在通话中</el-radio>
<el-radio :label="5">暂时无法接通</el-radio>
</el-radio-group>
</div>
<span class="f16 f-weight500 mt-16">沟通对象</span>
<div class="mt-16">
<el-select v-model="mrObj.FollowStatus"
clearable placeholder="请选择沟通对象"
@keydown.enter.native="handleSearch"
class="width100">
<span class="f16 f-weight500 mt-8">沟通对象</span>
<div class="mt-8">
<el-select size="small" v-model="mrObj.linkedPerson" multiple placeholder="请选择沟通对象" class="width100">
<el-option
v-for="item in FollowStatusEnum"
:key="item.label"
:label="item.label"
:value="item.value">
v-for="item in PersonData"
:key="item.id"
:label="item.name+'-'+item.phone"
:value="item.id">
</el-option>
</el-select>
</div>
<span class="f16 f-weight500 mt-16">沟通情况</span>
<div class="mt-16">
<el-radio-group v-model="mrObj.communicateResult">
<span class="f16 f-weight500 mt-8">沟通情况</span>
<div class="mt-8">
<el-radio-group v-model="mrObj.communicationSituation">
<el-radio v-for="(item,index) in CommunicationOptions" :key="index" :label="item.value">{{item.label}}</el-radio>
</el-radio-group>
</div>
<div class="mt-16">
<div class="mt-8">
<el-input type="textarea" :rows="2"
placeholder="请输入内容" v-model="mrObj.remark">
placeholder="请输入内容" v-model="mrObj.communicationRemarks">
</el-input>
</div>
<span class="f16 f-weight500 mt-16">调解进度</span>
<div class="mt-16 mr—schedule">
<span :class="mrObj.recordStatus == item.value ? 'active':''" v-for="(item,index) in materialTypeOptions" :key="index" @click="mrObj.recordStatus = item.value">{{item.label}}</span>
<span class="f16 f-weight500 mt-8">调解进度</span>
<div class="mt-8 mr—schedule">
<span :class="mrObj.mediateStatus == item.value ? 'active':''" v-for="(item,index) in materialTypeOptions" :key="index" @click="mrObj.mediateStatus = item.value">{{item.label}}</span>
</div>
<span class="f16 f-weight500 mt-16">下次跟进时间</span>
<div class="mt-16 flex-row">
<span class="f16 f-weight500 mt-8">下次跟进时间</span>
<div class="mt-8 flex-row">
<el-radio-group v-model="mrObj.timeType" class="pt-8 mr-16" @change="daysAfterDate" >
<el-radio :label="0">自定义</el-radio>
<el-radio :label="1">1天后</el-radio>
@ -66,20 +81,21 @@
<el-radio :label="5">5天后</el-radio>
<el-radio :label="7">7天后</el-radio>
</el-radio-group>
<el-date-picker v-if="this.mrObj.timeType == 0" size="small" style="width: 150px;"
v-model="mrObj.nextDate"
<!-- <el-date-picker v-if="this.mrObj.timeType == 0" size="small" style="width: 150px;"
v-model="mrObj.nextFollowDate"
type="date"
placeholder="选择先还日期"
placeholder="选择下次跟进时间"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd">
</el-date-picker>
</el-date-picker> -->
<el-input-number v-if="this.mrObj.timeType == 0" v-model="mrObj.nextFollowDate" controls-position="right" size="small" @change="handleChange" :min="1" :max="100"></el-input-number>
</div>
<span class="f16 f-weight500 mt-16">录音或录像文件</span>
<div class="mt-16">
<upload-file :file-list="fileList" :max-count="1"
<span class="f16 f-weight500 mt-8">录音或录像文件</span>
<div class="mt-8">
<upload-file :file-list="fileList" :max-count="5"
:show-file-name="false"
uploadName=""
accept=".mp3,mp4"
accept=".mp3,.mp4,.jpg,.jpeg,.png"
:span="6"
:fileSize="50"
@handleUploadFile="handleUploadFile">
@ -98,7 +114,8 @@
</div>
</template>
<script>
import caseMaterial from "@/services/caseMaterial";
import api from "@/services/caseManagement";
import contactPerson from "@/services/contactPerson";
export default {
components: {
uploadFile: () => import('@/components/uploadFile.vue'),//
@ -110,57 +127,113 @@ export default {
return {}
},
},
caseId: {
type: String,
default: () => {
return ''
},
},
},
data() {
return {
CommunicationOptions:[{ label: '继续沟通', value: 'CONTINUE' },{ label: '一次性全部回款', value: 'ALL' },{ label: '全部分期', value: 'STAGES' },
{ label: '部分还款', value: 'PART' },{ label: '拒绝沟通', value: 'REFUSE' }],
CommunicationOptions:[{ label: '继续沟通', value: '4' },{ label: '一次性全部回款', value: '1' },{ label: '全部分期', value: '2' },
{ label: '部分还款', value: '3' },{ label: '拒绝沟通', value: '5' }],
materialTypeOptions: [
{ label: '承诺账户', value: 'COMMITMENT_ACCOUNTS' },
{ label: '重点账户', value: 'FOCUSED_ACCOUNTS' },
{ label: '拒联账户', value: 'DISCONNECTED_ACCOUNTS' },
{ label: '失联账户', value: 'CLOSED_ACCOUNTS' },
{ label: '疑难账户', value: 'DIFFICULT_ACCOUNTS' },
{ label: '失联账户', value: 'LOST_ACCOUNTS' },
{ label: '半失联账户', value: 'SEMI_DISCONNECTED_ACCOUNTS' },
{ label: '部分还款账户', value: 'PARTIAL_REPAYMENT_ACCOUNT' },
{ label: '诉讼案件', value: 'LITIGATION_CASES' },
{label:'承诺账户',value:'1'},{label:'重点账户',value:'2'},{label:'拒联账户',value:'3'},{label:'已结清客户',value:'4'},
{label:'疑难账户',value:'5'},{label:'失联账户',value:'6'},{label:'半失联账户',value:'7'},{label:'部分还款账户',value:'8'},
{label:'适诉案件',value:'9'},{label:'可联账户',value:'10'},{label:'投诉倾向客户',value:'11'},{label:'分期客户',value:'12'},
{label:'其他/无标签',value:'13'}
],
mrObj: {
timeType:1,
caseId: '',
contactName: '',//
contactPhone: '',//
paybackId: '',//id
communicateResult: '',//
remark: '',//
nextDate: '',//
recordStatus: '',//
recordFileIds: '',//id使
labelIds: '',//id使
debtorId: '',//id
id:'',
timeType:0,
caseId:'',//id
linkedWay:1,//1 2 3
linkedType:2,//1线 2线
linkedPerson:[],//
linkedSituation:0,//
communicationSituation:'4',//
communicationRemarks:'',//
mediateStatus:'',//
linkedTime:'',//
linkedDuration:'',//
callWay:'',//
callStartTime:'',//
callEndTime:'',//
nextFollowDate:1,//
files:[],//
},
fileList: [],
PersonData:[],
};
},
mounted() {
this.daysAfterDate()
},
methods: {
daysAfterDate() {
console.log(this.mrObj.timeType,'timeType')
// this.daysAfterDate()
if(this.mrObj.id == ''){
//
let currentDate = new Date();
//
const nextDate = currentDate
currentDate.setDate(currentDate.getDate() + this.mrObj.timeType)
const year = nextDate.getFullYear();
const month = (nextDate.getMonth() + 1).toString().padStart(2, '0');
const day = nextDate.getDate().toString().padStart(2, '0');
this.mrObj.nextDate = year +'-'+ month +'-'+ day;
this.mrObj.linkedTime = this.$util.getDatetimeValue(currentDate);
}
this.getList()
},
methods: {
//
getList() {
let dataJson = {
size: 9999,
current: 1,
caseId: this.caseId
}
contactPerson.debtorPage(dataJson).then(res => {
if (!res.code) {
this.PersonData = res.records.map((item) => {
let surname = item.name.split('')[0];
return {
...item,
surname: surname
}
});
}
contactPerson.agentPage(dataJson).then(res => {
if (!res.code) {
let PersonAgent = res.records.map((item) => {
let surname = item.name.split('')[0];
return {
...item,
surname: surname
}
});
if(PersonAgent.length > 0)
{
PersonAgent.forEach(item => {
this.PersonData.push(item)
});
}
}
})
})
},
daysAfterDate() {
if(this.mrObj.timeType == 0){this.mrObj.nextFollowDate = 1 ;}
else{this.mrObj.nextFollowDate = this.mrObj.timeType ;}
//
// let currentDate = new Date();
// //
// const nextDate = currentDate
// currentDate.setDate(currentDate.getDate() + this.mrObj.timeType)
// const year = nextDate.getFullYear();
// const month = (nextDate.getMonth() + 1).toString().padStart(2, '0');
// const day = nextDate.getDate().toString().padStart(2, '0');
// this.mrObj.nextFollowDate = year +'-'+ month +'-'+ day;
},
handleUploadFile(fileList){
// console.log('',fileList)
console.log('获取上传文件信息',fileList)
fileList = JSON.parse(JSON.stringify(fileList))
this.fileList = fileList.map((item,i) => {
return {
@ -170,20 +243,31 @@ export default {
objectName: item.objectName
}
})
this.repaymentObj.url = this.fileList.length?this.fileList[0].fileName : '';
this.repaymentObj.name = this.fileList.length?this.fileList[0].objectName : '';
// this.repaymentObj.url = this.fileList.length?this.fileList[0].fileName : '';
// this.repaymentObj.name = this.fileList.length?this.fileList[0].objectName : '';
},
handleClose() {
this.$emit('update:visiblemediatRecord', false)
},
handleSubmit() {
if(!this.$clickThrottle()) { return }//
if(this.mrObj.linkedPerson.length == 0)
{
this.$message.warning("请选择沟通对象");
return false
}
this.mrObj.caseId = this.caseId
this.fileList.forEach(item =>{
this.mrObj.files.push(item.url)
})
console.log(this.mrObj,'this.mrObj')
// caseMaterial.addCaseFile(this.repaymentObj).then(res => {
// this.$parent.getFileCaseList()
// this.handleClose()
// this.$message.success("");
// })
api.mediate_record_save(this.mrObj).then(res => {
// this.$parent.getFileCaseList()
this.handleClose()
this.$message.success("新增调解记录成功");
})
}
}

View File

@ -92,28 +92,28 @@
<div class="position_info character-info theme-blue">
<div class="character-info-title">基本信息</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名姓名姓</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">{{portraitInfo.name}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">性别</div>
<div class="character-info-details-text">{{portraitInfo.gender == 'Male' ?'男':'女'}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">电话</div>
<div class="character-info-details-text">{{portraitInfo.phoneNumber}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">居住地</div>
<div class="character-info-details-text">{{ getAddress(portraitInfo.residencePlace) }} {{portraitInfo.residenceAddress}} </div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">经济状况</div>
<div class="character-info-details-text">{{portraitInfo.economicStatus}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">雇佣状态</div>
<div class="character-info-details-text">{{portraitInfo.employmentStatus}}</div>
</div>
</div>
@ -121,12 +121,12 @@
<div class="position_family character-info theme-green">
<div class="character-info-title">家庭情况</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">婚姻状况</div>
<div class="character-info-details-text">{{portraitInfo.maritalStatus}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">家庭成员</div>
<div class="character-info-details-text">{{portraitInfo.familyMembers}}</div>
</div>
</div>
@ -134,16 +134,16 @@
<div class="position_carry character-info theme-pink">
<div class="character-info-title">执行情况</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">是否被执行</div>
<div class="character-info-details-text">{{portraitInfo.isExecuted =='Yes'?'是':'否'}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">机构黑名单</div>
<div class="character-info-details-text">{{portraitInfo.isBlacklisted =='Yes'?'是':'否'}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">是否失信人员</div>
<div class="character-info-details-text">{{portraitInfo.isUntrustworthy =='Yes'?'是':'否'}}</div>
</div>
</div>
@ -151,127 +151,128 @@
<div class="position_finance character-info theme-yellow">
<div class="character-info-title">财务资产情况</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">信用等级</div>
<div class="character-info-details-text">{{portraitInfo.creditRating}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">逾期</div>
<div class="character-info-details-text">{{portraitInfo.overdue}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">欠款</div>
<div class="character-info-details-text">{{portraitInfo.arrears}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">信用卡</div>
<div class="character-info-details-text">{{portraitInfo.creditCardCount}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">信用卡额度</div>
<div class="character-info-details-text">{{portraitInfo.creditLimit}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">资产</div>
<div class="character-info-details-text">{{portraitInfo.assetSituation}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">还款行为</div>
<div class="character-info-details-text">{{portraitInfo.repaymentBehavior}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">消费行为</div>
<div class="character-info-details-text">{{portraitInfo.consumptionBehavior}}</div>
</div>
</div>
<!-- 风险情况 -->
<div class="position_risk character-info theme-pink2">
<div class="character-info-title">风险情况</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">风险评估</div>
<div class="character-info-details-text">{{portraitInfo.riskAssessment}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">建议措施</div>
<div class="character-info-details-text">{{portraitInfo.suggestedMeasures}}</div>
</div>
</div>
<!-- 适诉情况 -->
<div class="position_lawsuit character-info theme-purple">
<div class="character-info-title">适诉情况</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">还款意愿</div>
<div class="character-info-details-text">{{portraitInfo.repaymentWillingness}}</div>
</div>
<div class="character-info-details flex-row">
<div class="character-info-details-label">姓名</div>
<div class="character-info-details-text">陈继平</div>
<div class="character-info-details-label">诉讼</div>
<div class="character-info-details-text">{{portraitInfo.litigationSituation}}</div>
</div>
</div>
</div>
</el-scrollbar>
</div>
<div class="portrait-marker" v-if="rightActive != 1">
<el-scrollbar :style="'height:'+`${portraitcontentHeight}`+'px'">
<div class="flex-column p-16">
<el-scrollbar ref="scrollContainer" :style="'height:'+`${portraitcontentHeight}`+'px'">
<div ref="positionContainer" class="flex-column p-16">
<div class="f18">基本信息</div>
<div class="f16 mt-16"><a class="dot"></a>身份信息</div>
<div ref="targetPerson" class="f16 mt-16"><a class="dot"></a>身份信息</div>
<div class="person-info flex-column mt-16">
<span>姓名<a class="color-000">XXXXX</a></span>
<span>性别<a class="color-000">XXXXX</a></span>
<span>年龄<a class="color-000">XXXXX</a></span>
<span>手机号码<a class="color-000">XXXXX</a></span>
<span>身份证号<a class="color-000">XXXXX</a></span>
<span>姓名<a class="color-000">{{portraitInfo.name}}</a></span>
<span>性别<a class="color-000">{{portraitInfo.gender == 'Male' ? '男':'女'}}</a></span>
<span>年龄<a class="color-000">{{portraitInfo.age}}</a></span>
<span>手机号码<a class="color-000">{{portraitInfo.phoneNumber}}</a></span>
<span>身份证号<a class="color-000">{{portraitInfo.idCardNumber}}</a></span>
</div>
<div class="f16 mt-16"><a class="dot"></a>地理位置</div>
<div ref="targetAddress" class="f16 mt-16"><a class="dot"></a>地理位置</div>
<div class="flex-column">
<span class="mt-8">户籍所在地</span>
<span class="mt-8">
<el-cascader size="small" v-model="portraitInfo.value1" class="width100" :options="provinces" :props="{ lazy: true, lazyLoad: loadOptions }" ></el-cascader>
<el-cascader size="small" :placeholder="getAddress(portraitObj.domicilePlace)" v-model="portraitObj.domicilePlace" class="width100" :options="provinces" :props="{ lazy: true, lazyLoad: loadOptions }" ></el-cascader>
</span>
<span class="mt-8">
<el-input size="small" v-model="portraitInfo.input" placeholder="请输入详细地址"></el-input>
<el-input size="small" v-model="portraitObj.domicileAddress" placeholder="请输入详细地址,楼栋单元" maxlength="30"></el-input>
</span>
<span class="mt-8">常住地址</span>
<span class="mt-8">
<el-cascader size="small" v-model="portraitInfo.value2" class="width100" :options="provinces" :props="{ lazy: true, lazyLoad: loadOptions }"></el-cascader>
<!-- :placeholder="getAddress(portraitObj.residencePlace)" -->
<el-cascader size="small" :placeholder="getAddress(portraitObj.residencePlace)" v-model="portraitObj.residencePlace" class="width100" :options="provinces" :props="{ lazy: true, lazyLoad: loadOptions }"></el-cascader>
</span>
<span class="mt-8">
<el-input size="small" v-model="portraitInfo.input" placeholder="请输入详细地址"></el-input>
<el-input size="small" v-model="portraitObj.residenceAddress" placeholder="请输入详细地址,楼栋单元" maxlength="30"></el-input>
</span>
<span class="mt-8">工作地点</span>
<span class="mt-8">
<el-cascader size="small" v-model="portraitInfo.value3" class="width100" :options="provinces" :props="{ lazy: true, lazyLoad: loadOptions }" ></el-cascader>
<el-cascader size="small" :placeholder="getAddress(portraitObj.workPlace)" v-model="portraitObj.workPlace" class="width100" :options="provinces" :props="{ lazy: true, lazyLoad: loadOptions }" ></el-cascader>
</span>
<span class="mt-8">
<el-input size="small" v-model="portraitInfo.input" placeholder="请输入详细地址"></el-input>
<el-input size="small" v-model="portraitObj.workAddress" placeholder="请输入详细地址,楼栋单元" maxlength="30"></el-input>
</span>
</div>
<div class="f18 mt-16">经济状况</div>
<div ref="targetRevenue" class="f18 mt-16">经济状况</div>
<div class="f16 mt-16"><a class="dot"></a>经济收入</div>
<div class="box-list">
<span>收入0-5K</span>
<span>收入5-10K</span>
<span>收入10K以上</span>
<span>无收入</span>
<div class="box-list" >
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'REVENUE')" :key="index" @click="portraitObj.economicStatus = item.labelName " :class="portraitObj.economicStatus == item.labelName ? 'active':''">{{item.labelName}}</span>
</div>
<div class="f16 mt-16"><a class="dot"></a>雇佣状态</div>
<div ref="targetJob" class="f16 mt-16"><a class="dot"></a>雇佣状态</div>
<div class="box-list">
<span>待业</span>
<span>零工</span>
<span>稳定工作</span>
<span>个体户</span>
<span>小微企业</span>
<span>企业法人</span>
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'JOB')" :key="index" @click="portraitObj.employmentStatus = item.labelName " :class="portraitObj.employmentStatus == item.labelName ? 'active':''">{{item.labelName}}</span>
</div>
<div class="f18 mt-16">信用历史</div>
<div ref="targetCredit" class="f18 mt-16">信用历史</div>
<div class="f16 mt-16"><a class="dot"></a>信用报告</div>
<div class="f16 mt-16"><a class="dot"></a>信贷记录</div>
<div class="f16 mt-16"><a class="dot"></a>信用卡</div>
<div class="f18 mt-16">财务资产和负债</div>
<div class="f16 mt-16"><a class="dot"></a>财产情况</div>
<div ref="targetProperty" class="f16 mt-16"><a class="dot"></a>财产情况</div>
<div class="box-list">
<span>有房</span>
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'PROPERTY')" :key="index" @click="portraitObj.assetSituation = item.labelName " :class="portraitObj.assetSituation == item.labelName ? 'active':''">{{item.labelName}}</span>
<!-- <span>有房</span>
<span>有车</span>
<span>存款</span>
<span>投资</span>
<span>小微企业</span>
<span>企业法人</span>
<span>投资</span> -->
</div>
<div class="f16 mt-16"><a class="dot"></a>负债情况</div>
<div ref="targetLiability" class="f16 mt-16"><a class="dot"></a>负债情况</div>
<div class="box-list">
<span>多头借贷</span>
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'LIABILITY')" :key="index" @click="portraitObj.arrears = item.labelName " :class="portraitObj.arrears == item.labelName ? 'active':''">{{item.labelName}}</span>
<!-- <span>多头借贷</span>
<span>信用卡负债</span>
<span>银行其他负债</span>
<span>非银负债</span>
@ -280,27 +281,30 @@
<span>负债10-50W</span>
<span>负债50-100W</span>
<span>负债100W以上</span>
<span>存在还款竞争</span>
<span>存在还款竞争</span> -->
</div>
<div class="f18 mt-16">家庭状况</div>
<div class="f16 mt-16"><a class="dot"></a>婚姻状况</div>
<div ref="targetMatrimony" class="f16 mt-16"><a class="dot"></a>婚姻状况</div>
<div class="box-list">
<span>未婚</span>
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'MATRIMONY')" :key="index" @click="portraitObj.maritalStatus = item.labelName " :class="portraitObj.maritalStatus == item.labelName ? 'active':''">{{item.labelName}}</span>
<!-- <span>未婚</span>
<span>已婚</span>
<span>离婚</span>
<span>离婚</span> -->
</div>
<div class="f16 mt-16"><a class="dot"></a>家庭成员</div>
<div ref="targetFamily" class="f16 mt-16"><a class="dot"></a>家庭成员</div>
<div class="box-list">
<span>无子女</span>
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'FAMILY')" :key="index" @click="portraitObj.familyMembers = item.labelName " :class="portraitObj.familyMembers == item.labelName ? 'active':''">{{item.labelName}}</span>
<!-- <span>无子女</span>
<span>有子女</span>
<span>有父母</span>
<span>无父母</span>
<span>无父母</span> -->
</div>
<div class="f18 mt-16">行为分析</div>
<div class="f16 mt-16"><a class="dot"></a>消费行为</div>
<div ref="targetConsumption" class="f16 mt-16"><a class="dot"></a>消费行为</div>
<div class="box-list">
<span>收入匹配消费</span>
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'CONSUMPTION')" :key="index" @click="portraitObj.consumptionBehavior = item.labelName " :class="portraitObj.consumptionBehavior == item.labelName ? 'active':''">{{item.labelName}}</span>
<!-- <span>收入匹配消费</span>
<span>超前消费</span>
<span>滞后消费</span>
<span>日常消费</span>
@ -311,25 +315,37 @@
<span>异地消费</span>
<span>线上消费</span>
<span>消费增长</span>
<span>消费下降</span>
<span>消费下降</span> -->
</div>
<div class="f16 mt-16"><a class="dot"></a>还款行为</div>
<div ref="targetRepayment" class="f16 mt-16"><a class="dot"></a>还款行为</div>
<div class="box-list">
<span>按时还</span>
<span>不按时还</span>
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'REPAYMENT')" :key="index" @click="portraitObj.repaymentBehavior = item.labelName " :class="portraitObj.repaymentBehavior == item.labelName ? 'active':''">{{item.labelName}}</span>
<!-- <span>按时还</span>
<span>不按时还</span> -->
</div>
<div class="f18 mt-16">风险评估和建议</div>
<div class="f18 mt-16">诉讼情况</div>
<div class="f16 mt-16"><a class="dot"></a>涉诉讼</div>
<div class="box-list">
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'LAWSUIT')" :key="index" @click="portraitObj.litigationSituation = item.labelName " :class="portraitObj.litigationSituation == item.labelName ? 'active':''">{{item.labelName}}</span>
</div>
<div class="f16 mt-16"><a class="dot"></a>还款意愿</div>
<div class="box-list">
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'WILLINGNESS_TO_REPAY')" :key="index" @click="portraitObj.repaymentWillingness = item.labelName " :class="portraitObj.repaymentWillingness == item.labelName ? 'active':''">{{item.labelName}}</span>
</div>
<div ref="targetRisk" class="f18 mt-16">风险评估和建议</div>
<div class="f16 mt-16"><a class="dot"></a>风险评估</div>
<div class="box-list">
<span>低风险</span>
<span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'RISK')" :key="index" @click="portraitObj.riskAssessment = item.labelName " :class="portraitObj.riskAssessment == item.labelName ? 'active':''">{{item.labelName}}</span>
<!-- <span>低风险</span>
<span>中风险</span>
<span>高风险</span>
<span>高风险</span> -->
</div>
<div class="f16 mt-16"><a class="dot"></a>建议措施</div>
<div class="box-list">
<span>调整还款计划</span>
<!-- <span v-for="(item,index) in debtorProlabels.filter(item => item.labelGroup == 'RISK')" :key="index" @click="portraitObj.suggestedMeasures = item.labelName " :class="portraitObj.suggestedMeasures == item.labelName ? 'active':''">{{item.labelName}}</span> -->
<!-- <span>调整还款计划</span>
<span>增加收入</span>
<span>减少支出</span>
<span>减少支出</span> -->
</div>
</div>
@ -360,10 +376,45 @@ export default {
return {
debtorEntityList:[],
portraitInfo:{},
portraitObj:{
debtorId:'',
id:'',
domicilePlace:[],////
domicileAddress:'',//
residencePlace:[],////
residenceAddress:'',//
workPlace:[],////
workAddress:'',//
economicStatus:'',//
employmentStatus:'',// Employed, Unemployed, Self-employed
maritalStatus:'',// Single, Married, Divorced
familyMembers:'',// JSON
isExecuted:'',//Yes No
isBlacklisted:'',//Yes No
isUntrustworthy:'',//Yes No
creditRating:'',//
overdue:'',//
arrears:'',//
creditCardCount:'',//
creditLimit:'',//
assetSituation:'',//
consumptionBehavior:'',//
repaymentBehavior:'',//
repaymentWillingness:'',//
litigationSituation:'',//
riskAssessment:'',//
suggestedMeasures:'',//
},
initlocation: null,
provinces: [],
rightActive: 1,
debtorProfiles:[],
debtorProlabels:[],
Rollposition:[{key:'targetPerson',active:1},{key:'targetPerson',active:2},{key:'targetAddress',active:3},{key:'targetRevenue',active:4},
{key:'targetJob',active:5},{key:'targetCredit',active:6},{key:'targetCredit',active:7},{key:'targetCredit',active:8},
{key:'targetLiability',active:9},{key:'targetMatrimony',active:10},{key:'targetMatrimony',active:11},
{key:'targetFamily',active:12},{key:'targetConsumption',active:13},{key:'targetRisk',active:14},{key:'targetRisk',active:15},
{key:'targetRisk',active:16},
],
};
},
computed: {
@ -391,14 +442,98 @@ export default {
return oh - 57 - 130
},
},
watch: {
//
rightActive: {
immediate: true,
handler() {
setTimeout(() => {
this.scrollToPosition()
}, 200);
}
},
portraitObj: {
handler: function(newVal, oldVal) {
//
// console.log('Object changed!');
setTimeout(() => {
this.handleSubmit()
}, 500);
},
deep: true //
}
},
mounted() {
this.initlocation = new ChinaLocation(chinalist);
this.getCaseInfoById()
},
methods: {
isJsonString(str) {
try {
str.forEach(item =>{})
return true;
} catch (e) {
return false;
}
},
getAddress(residencePlace){
if(residencePlace == undefined || residencePlace == null || residencePlace == '')
{
return ''
}
let residencePlaceNew = null
if(!this.isJsonString(residencePlace)){
residencePlaceNew = JSON.parse(residencePlace)
}
else
{
residencePlaceNew = residencePlace
}
const getlocation = new ChinaLocation(chinalist);
const newProvince = residencePlaceNew[0];
const newCity = residencePlaceNew[1];
const newDistrict = residencePlaceNew[2];
getlocation.changeProvince(newProvince);
getlocation.changeCity(newCity);
getlocation.changeDistrict(newDistrict);
getlocation.changeLocation(newProvince, newCity, newDistrict);
const newLocation = getlocation.getCurrentAddress();
return newLocation.province.name + '/' + newLocation.city.name + '/' + newLocation.district.name
},
scrollToPosition() {
const scrollbar = this.$refs.scrollContainer
if (scrollbar) {
const wrap = scrollbar.$refs.wrap;
if (wrap) {
let scrollTo = this.scrollToTarget()
// 100
// wrap.scrollTo(0, 500);
wrap.scrollTo({
left: 0,
top: scrollTo,
behavior: 'smooth' // 使'smooth'
});
}
}
},
scrollToTarget() {
let positionData = this.Rollposition.find(item =>{
return item.active == this.rightActive
})
const scrollContainer = this.$refs.positionContainer;
const targetElement = this.$refs[positionData.key];
//
const scrollPosition = targetElement.offsetTop - scrollContainer.offsetTop;
return scrollPosition
},
//
loadOptions(node, resolve) {
const { level } = node;
console.log(level,'levellevellevellevel')
//
setTimeout(() => {
if(level == 0)
@ -433,7 +568,6 @@ export default {
},
//
getCaseInfoById() {
let _that = this
api.getCaseInfoById(this.caseId).then(res => {
if (!res.code) {
this.debtorEntityList = res.debtorEntityList
@ -445,7 +579,7 @@ export default {
getdebtorProfile(){
api.debtorProfile_labels({}).then(res => {
if (!res.code) {
this.debtorProfiles = res;
this.debtorProlabels = res;
}
})
//
@ -454,25 +588,27 @@ export default {
if(debtors != undefined)
{
debtorId = debtors.id
this.portraitObj.debtorId = debtorId
}
api.debtorProfile_getByDebtorId(debtorId).then(res => {
this.getByDebtorId()
},
//
getByDebtorId(){
api.debtorProfile_getByDebtorId(this.portraitObj.debtorId).then(res => {
if (!res.code) {
// this.debtorProfiles = res;
// residencePlaceDes
this.portraitInfo = res;
this.portraitObj = res
}
})
},
//
handleSubmit() {
if(!this.$clickThrottle()) { return }//
console.log(this.mrObj,'this.mrObj')
// caseMaterial.addCaseFile(this.repaymentObj).then(res => {
// this.$parent.getFileCaseList()
// this.handleClose()
// this.$message.success("");
// })
// console.log(this.portraitObj,'this.mrObj')
api.debtorProfile_edit(this.portraitObj).then(res => {
// this.getdebtorProfile()
})
}
}
};
@ -684,6 +820,10 @@ export default {
margin-right: 10px;
cursor: pointer;
}
span.active{
color: #BC6F60;
border: solid 1px #BC6F60;
}
}
}
}

View File

@ -251,7 +251,7 @@ const caseManagementApi = {
// 同组的用户列表(协办员选择项)
getCurrGroupUserList: data => {
return service.service.get(`${apiAdmin}system/user/getCurrGroupUserList`, data)
return service.service.get(`${apiAdmin}system/user/getCurrGroupUserList`, data, {hideLoading:true})
},
// 配置协办员
updateAssistMediator: data => {
@ -260,15 +260,24 @@ const caseManagementApi = {
// 人物画像-查询当前债务人画像信息
debtorProfile_getByDebtorId: data => {
return service.service.get(`${apiAdmin}api/portrait/debtorProfile/getByDebtorId?id=${data}`)
return service.service.get(`${apiAdmin}api/portrait/debtorProfile/getByDebtorId?id=${data}`, {hideLoading:true})
},
// 人物画像-编辑债务人的画像信息
debtorProfile_edit: data => {
return service.service.post(`${apiAdmin}api/portrait/debtorProfile/edit`, data)
return service.service.post(`${apiAdmin}api/portrait/debtorProfile/edit`, data, {hideLoading:true})
},
// 人物画像-标签列表
debtorProfile_labels: data => {
return service.service.post(`${apiAdmin}api/portrait/debtorProfile/labels`, data)
return service.service.post(`${apiAdmin}api/portrait/debtorProfile/labels`, data, {hideLoading:true})
},
// 调解记录-新增/修改调解记录
mediate_record_save: data => {
return service.service.post(`${apiAdmin}case/mediate/record/save`, data)
},
// 调解记录-调解记录列表
mediate_record_list: data => {
return service.service.post(`${apiAdmin}case/mediate/record/list`, data, {hideLoading:true})
},

View File

@ -331,6 +331,21 @@ const util = {
}
target.blur();
},
getDatetimeValue(){
// 获取当前时间
const now = new Date();
// 格式化时间
const year = now.getFullYear();
const month = now.getMonth() + 1;
const day = now.getDate();
const hour = now.getHours();
const minute = now.getMinutes();
const second = now.getSeconds();
const currentTime = `${year}-${month >= 10 ? month : '0' + month}-${day >= 10 ? day : '0' + day} ${hour >= 10 ? hour : '0' + hour}:${minute >= 10 ? minute : '0' + minute}:${second >= 10 ? second : '0' + second}`;
// 将格式化后的时间存入 data 中
return currentTime;
},
//获取本月天数
mGetDate(){
var date = new Date();