Commit abd750cd authored by 沈翠玲's avatar 沈翠玲

部分接口对接

parent 1c863f1d
import request from '@/utils/http/index';
export const saveUser = (data) => {
return request.post('/login/save', data);
};
export const getCreditPage = (params) => {
return request.get('/Credit/page', params);
};
export const getCredit = (id) => {
return request.get('/Credit/getById?id=' + id);
};
export const getTrackRecordPage = (params) => {
return request.get('/TrackRecord/page', params);
};
export const saveTrackRecord = (data) => {
return request.post('/TrackRecord/save', data);
};
<template>
<div class="card content-box">
<span class="text"> 修复审批 🍓🍇🍈🍉</span>
<div class="table-box">
<ProTable :config="config" :data="tabledata" :showPagination="false" :showToolBar="true">
<template #left_buttons>
<el-button type="primary">下载申请 </el-button>
<el-button type="primary">审批 </el-button>
<el-button type="primary">下载 </el-button>
<el-button type="primary">批量修复上传 </el-button>
</template>
</ProTable>
</div>
</template>
<script setup name="systemLog"></script>
<script setup name="systemLog" lang="jsx">
import { computed } from 'vue';
import { reactive, ref } from 'vue';
const tabledata = ref([]);
const config = computed(() => {
return {
columns: [
{ type: 'checkbox', width: 50 },
{ type: 'seq', width: 50 },
{
field: 'code',
title: '联系人姓名',
search: { el: 'input', props: { clearable: true } },
},
{
field: 'code',
title: '与债权人关系',
search: { el: 'input', props: { clearable: true } },
},
{
field: 'code',
title: '号码类型',
search: { el: 'input', props: { clearable: true } },
},
],
};
});
tabledata.value = [
{ name: 'admin', code: 'admin', role: 'superadmin', num: 1 },
{ name: 'account1', code: 'account1', role: 'user', num: 1 },
{ name: 'account2', code: 'account2', role: 'user', num: 1 },
{ name: 'account3', code: 'account3', role: 'user', num: 1 },
];
</script>
......@@ -12,22 +12,22 @@
<div class="flex justify-between">
<div>
<span class="text-gray-400">姓名:</span>
<span>44444</span>
<span>{{ currentInfo.name }}</span>
</div>
<div>
<span class="text-gray-400">与案人关系:</span>
<span>44444</span>
<span>{{ currentInfo.kinship }}</span>
</div>
<div>
<span class="text-gray-400">联系号码:</span>
<span>44444</span>
<span>{{ currentInfo.phone }}</span>
</div>
<div>
<span class="text-gray-400">号码状态:</span>
<span>
<el-radio-group v-model="radio1">
<el-radio value="1">无效</el-radio>
<el-radio label="2">有效</el-radio>
<el-radio-group v-model="currentInfo.status">
<el-radio value="N">无效</el-radio>
<el-radio value="Y">有效</el-radio>
</el-radio-group>
</span>
</div>
......@@ -55,7 +55,7 @@
<el-col :span="24">
<el-form-item class="w-full" label="跟进时间:" prop="name">
<el-date-picker
v-model="form.datetime"
v-model="form.trackTime"
class="w-full"
format="YYYY-MM-DD HH:mm:ss"
type="datetime"
......@@ -66,7 +66,7 @@
<el-form-item class="w-full" label="下次跟进时间:" prop="code">
<div>
<el-date-picker
v-model="form.lastTime"
v-model="form.nextTime"
class="w-full"
format="YYYY-MM-DD HH:mm:ss"
type="datetime"
......@@ -117,11 +117,11 @@
size="small"
style="margin-left: 0"
class="mr-2 mb-2"
:type="form.status === item1.label ? 'primary' : null"
:type="form.phoneResultStatus === item1.value ? 'primary' : null"
plain
v-for="(item1, index1) in statusArr"
:key="`btn${index1}`"
@click="form.status = item1.label"
@click="form.phoneResultStatus = item1.value"
>{{ item1.label }}</el-button
>
</el-form-item>
......@@ -141,13 +141,15 @@
</el-form>
</div>
<div class="w-1/2">
<p class="font-bold mb-2">跟进附件:</p>
<p class="font-bold mb-2 mt-2">跟进附件:</p>
<el-form inline :model="form" :rules="rules" label-width="110px" label-position="left">
<el-form-item class="w-full" label="通话录音:" prop="code">
<el-upload
class="avatar-uploader"
:action="'https://jsonplaceholder.typicode.com/posts/'"
:on-progress="uploadVideoProcess"
:action="url"
:on-success="handleFileSuccess"
:on-remove="handleRemove"
:auto-upload="true"
>
<el-button type="primary" plain :icon="Upload">上传录音文件</el-button>
</el-upload>
......@@ -156,12 +158,13 @@
</el-form-item>
<el-form-item label="微信图片附件:" prop="code" class="w-full">
<el-upload
v-model:file-list="form.wxfiles"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
v-model:file-list="form.images"
:action="url"
list-type="picture-card"
class="mypicture"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:on-success="handleFileSuccess1"
:on-remove="handleRemove1"
>
<div class="text-center">
<el-icon><Plus /></el-icon>
......@@ -171,12 +174,13 @@
</el-form-item>
<el-form-item label="短信图片附件:" prop="code" class="w-full">
<el-upload
v-model:file-list="form.messagefiles"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
v-model:file-list="form.notes"
:action="url"
list-type="picture-card"
class="mypicture"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:on-success="handleFileSuccess2"
:on-remove="handleRemove2"
>
<div class="text-center">
<el-icon><Plus /></el-icon>
......@@ -186,12 +190,13 @@
</el-form-item>
<el-form-item label="其他图片附件:" prop="code" class="w-full">
<el-upload
v-model:file-list="form.otherfiles"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
v-model:file-list="form.others"
:action="url"
list-type="picture-card"
class="mypicture"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:on-success="handleFileSuccess3"
:on-remove="handleRemove3"
>
<div class="text-center">
<el-icon><Plus /></el-icon>
......@@ -220,6 +225,10 @@
import { reactive, ref } from 'vue';
import { ElInputNumber } from 'element-plus';
import { Upload } from '@element-plus/icons-vue';
import { getAppEnvConfig } from '@/utils/env';
import { saveTrackRecord } from '@/api/property';
const envs = getAppEnvConfig();
const url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/upload';
const showModal = ref(false);
const editFirst = ref(false);
const tabledata = ref([]);
......@@ -233,6 +242,7 @@
{ label: '联系人可联', children: [{ label: '接听有实质1' }, { label: '接听后2' }] },
{ label: '未接听', children: [{ label: '接听有实质3' }, { label: '接听后4' }] },
];
const resuleObj = reactive({
label: '本人可联',
childrenlabel: null,
......@@ -240,41 +250,53 @@
const form = reactive({
sum: 0,
wxfiles: [],
messagefiles: [],
otherfiles: [],
num: 0,
images: [],
notes: [],
phoneResultStatus: '',
others: [],
voices: [],
remark: '',
splitnum: 2,
status: null,
datetime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
lastTime: null,
trackTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
nextTime: null,
});
const currentAccount = ref({ people: 0, case: 0, money: 0 });
const currentDetail = ref({});
const currentInfo = ref({ name: 0, kinship: 0, phone: 0, status: '' });
const onHide = (done) => {
currentAccount.value = { people: 0, case: 0, money: 0 };
currentInfo.value = { name: 0, kinship: 0, phone: 0, status: '' };
done();
};
const statusArr = [
{
label: '后续再跟进',
value: '后续再跟进',
value: 'later',
},
{
label: '承诺还款',
value: '承诺还款',
value: 'Promise_Repayment',
},
{
label: '暂无还款意愿',
value: '暂无还款意愿',
value: 'No_Repay',
},
{
label: '要求停催',
value: '要求停催',
value: 'Stop_Urging',
},
{
label: '情绪激动抗拒',
value: 'resistance',
},
{
label: '要求停催1',
value: '要求停催1',
label: '拒绝还款',
value: 'Refuse_Repayment',
},
{
label: '已还款',
value: 'Repaired',
},
{
label: '代履行还款',
value: 'repayment_others',
},
];
const options = [
......@@ -304,7 +326,8 @@
selectdList.value = row.records;
};
const handleRemove = (uploadFile, uploadFiles) => {
console.log(uploadFile, uploadFiles);
const index = form.voices.findIndex((v) => v.name === uploadFile.name);
form.voices.splice(index, 1);
};
const handlePictureCardPreview = (uploadFile) => {
......@@ -313,13 +336,50 @@
};
const changeLastTime = (day) => {
if (day === 'tomorrow') {
form.lastTime = dayjs().add(1, 'day').format('YYYY-MM-DD HH:mm:ss');
form.nextTime = dayjs().add(1, 'day').format('YYYY-MM-DD HH:mm:ss');
} else if (day === 'tomorrowDay') {
form.lastTime = dayjs().add(2, 'day').format('YYYY-MM-DD HH:mm:ss');
form.nextTime = dayjs().add(2, 'day').format('YYYY-MM-DD HH:mm:ss');
} else {
form.lastTime = dayjs().add(3, 'day').format('YYYY-MM-DD HH:mm:ss');
form.nextTime = dayjs().add(3, 'day').format('YYYY-MM-DD HH:mm:ss');
}
};
const handleFileSuccess = (response, file, fileList) => {
form.voices.push({
url: response.message,
name: file.name,
});
};
const handleFileSuccess1 = (response, file, fileList) => {
form.images.push({
url: response.message,
name: file.name,
});
};
const handleRemove1 = (uploadFile, uploadFiles) => {
const index = form.images.findIndex((v) => v.name === uploadFile.name);
form.images.splice(index, 1);
};
const handleFileSuccess2 = (response, file, fileList) => {
console.log(response, file);
form.notes.push({
url: response.message,
name: file.name,
});
};
const handleRemove2 = (uploadFile, uploadFiles) => {
const index = form.notes.findIndex((v) => v.name === uploadFile.name);
form.notes.splice(index, 1);
};
const handleFileSuccess3 = (response, file, fileList) => {
form.others.push({
url: response.message,
name: file.name,
});
};
const handleRemove3 = (uploadFile, uploadFiles) => {
const index = form.others.findIndex((v) => v.name === uploadFile.name);
form.others.splice(index, 1);
};
const config = reactive({
minHeight: 200,
columns: [
......@@ -403,21 +463,26 @@
{ name: 'account2', code: 'account2', role: 'user', num: 1 },
{ name: 'account3', code: 'account3', role: 'user', num: 1 },
];
const uploadVideoProcess = (event, file, fileList) => {
progressFlag.value = true; // 显示进度条
loadProgress.value = parseInt(event.percent); // 动态获取文件上传进度
if (loadProgress.value >= 100) {
loadProgress.value = 100;
setTimeout(() => {
progressFlag.value = false;
}, 1000); // 一秒后关闭进度条
}
};
const openModal = (account) => {
const openModal = (info, detail) => {
showModal.value = true;
currentAccount.value = { people: 333, case: 44, money: 1111 };
currentInfo.value = info;
currentDetail.value = detail;
};
const submitForm = () => {
saveTrackRecord({
credit: currentDetail.value,
trackTime: form.trackTime,
nextTime: form.nextTime,
phoneResultStatus: form.phoneResultStatus,
remark: form.remark,
voices: form.voices,
images: form.images,
notes: form.notes,
others: form.others,
}).then((res) => {
console.log('refsss', res);
});
};
const submitForm = () => {};
defineExpose({
openModal,
});
......@@ -440,5 +505,9 @@
width: 100px;
height: 100px;
}
:deep(.el-upload-list__item) {
width: 100px;
height: 100px;
}
}
</style>
......@@ -14,12 +14,12 @@
<el-row :gutter="20">
<el-col :span="6">
<el-form-item class="w-full" label="姓名:" prop="name" label-width="72px">
{{ currentAccount.people }}
{{ currentDetail?.borrower?.name }}
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item class="w-full" label="身份证号:" prop="code" label-width="85px">
{{ currentAccount.people }}
{{ currentDetail?.borrower?.idCard }}
</el-form-item>
</el-col>
<el-col :span="10">
......@@ -44,21 +44,11 @@
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="修复前联系号码:" prop="role" label-width="140px">
{{ currentAccount.people }}
{{ currentDetail.people }}
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex-1">
<ProTable :config="config" :data="tabledata" :showPagination="false" :showToolBar="true">
<template #left_buttons>
<el-button type="primary">下载申请 </el-button>
<el-button type="primary">审批 </el-button>
<el-button type="primary">下载 </el-button>
<el-button type="primary">批量修复上传 </el-button>
</template>
</ProTable>
</div>
</div>
<template #footer>
<el-button type="default" @click="showModal = false">取消</el-button>
......@@ -75,30 +65,21 @@
const tabledata = ref([]);
const showModal = ref(false);
const currentAccount = ref({ people: 0, case: 0, money: 0 });
const currentDetail = ref({ people: 0, case: 0, money: 0 });
const form = reactive({
name: '',
relation: '',
});
const radio = ref(0);
const step = ref(0);
const onHide = () => {
currentAccount.value = { people: 0, case: 0, money: 0 };
currentDetail.value = { people: 0, case: 0, money: 0 };
};
const openModal = (account) => {
showModal.value = true;
currentAccount.value = { people: 333, case: 44, money: 1111 };
step.value = 0;
radio.value = 0;
currentDetail.value = { people: 333, case: 44, money: 1111 };
};
const submitForm = () => {
if (step.value || radio.value === 0) {
} else {
step.value = 1;
}
};
const submitForm = () => {};
const options = [
{
value: 'Option1',
......
<template>
<vxe-modal
v-model="showModal"
:title="currentInfo.title"
@hide="onHide"
height="482"
width="1003"
show-footer
esc-closable
>
<div class="w-full px-3 h-full overflow-auto flex-col flex mytable">
<template v-if="currentInfo.title === '结清减免还款' || currentInfo.title === '直接还款'">
<table style="margin-bottom: 10px" v-if="currentInfo.title === '结清减免还款'">
<tr>
<td class="label">减免类型</td>
<td>结清减免</td>
<td class="label">减免申请ID</td>
<td>30</td>
<td class="label">减免申请时间</td>
<td>30</td>
</tr>
<tr>
<td class="label">减免金额(总计)</td>
<td>johndoe@example.com</td>
<td class="label">减免案件数</td>
<td>johndoe@example.com</td>
<td class="label">减免生效时间</td>
<td>johndoe@example.com</td>
</tr>
<tr>
<td class="label">应还金额</td>
<td colspan="5">John Doe</td>
</tr>
<!-- Add more rows as needed -->
</table>
<table style="margin-bottom: 10px" v-else>
<tr>
<td class="label">案件ID</td>
<td>1111</td>
<td class="label">借款平台</td>
<td>30</td>
<td class="label">资管公司</td>
<td>30</td>
</tr>
<tr>
<td class="label">委案金额</td>
<td>johndoe@example.com</td>
<td class="label">累计减免金额</td>
<td>johndoe@example.com</td>
<td class="label">分期生效时间</td>
<td>johndoe@example.com</td>
</tr>
<tr>
<td class="label">剩余待还金额</td>
<td>John Doe</td>
<td class="label">累计还款金额</td>
<td colspan="3">John Doe</td>
</tr>
<!-- Add more rows as needed -->
</table>
<div>
<el-form ref="formRef" inline :model="form" :rules="rules" label-width="110px">
<el-row>
<el-col :span="8">
<el-form-item class="w-full" label="实际还款金额:" prop="name">
<div>
<el-input v-model="form.name" placeholder="请输入" style="width: 100%" />
<div class="text-red-500">*金额必须等于应还金额</div>
</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item class="w-full" label="实际还款时间:" prop="name">
<el-date-picker
v-model="form.datetime"
class="w-full"
format="YYYY-MM-DD HH:mm:ss"
type="datetime"
/>
</el-form-item>
</el-col>
<el-col :span="8" v-if="currentInfo.title === '结清减免还款'">
<el-form-item class="w-full" label="付款凭证:" prop="name">
<el-upload
v-model:file-list="form.files"
:action="url"
list-type="picture-card"
class="mypicture"
:on-success="handleFileSuccess"
:auto-upload="true"
:on-remove="handleRemove"
>
<div class="text-center">
<el-icon><Plus /></el-icon>
<div>付款相关附件</div>
</div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<template v-if="currentInfo.title === '分期还款'">
<table style="margin-bottom: 10px">
<tr>
<td class="label">分期申请ID</td>
<td>1111</td>
<td class="label">还款总额</td>
<td>30</td>
<td class="label">分期申请时间</td>
<td>30</td>
</tr>
<tr>
<td class="label">还款期数</td>
<td>johndoe@example.com</td>
<td class="label">首期还款日</td>
<td>johndoe@example.com</td>
<td class="label">分期生效时间</td>
<td>johndoe@example.com</td>
</tr>
<tr>
<td class="label">期次</td>
<td>111</td>
<td class="label">期次还款到期日</td>
<td colspan="3">John Doe</td>
</tr>
<tr>
<td class="label">期次应还金额</td>
<td>111</td>
<td class="label">期次还款状态</td>
<td colspan="3">John Doe</td>
</tr>
</table>
<div class="flex">
<div class="w-2/5 pr-11">
<el-form ref="formRef" inline :model="form" :rules="rules" label-width="110px">
<el-row>
<el-col :span="24">
<el-form-item class="w-full" label="实际还款时间:" prop="name">
<el-date-picker
v-model="form.datetime"
class="w-full"
format="YYYY-MM-DD HH:mm:ss"
type="datetime"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="实际还款金额:" prop="name">
<div class="w-full">
<el-input v-model="form.name" placeholder="请输入" class="w-full" />
<div class="text-red-500">*金额必须等于应还金额</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div class="w-3/5">
<ProTable
:config="config"
:data="tabledata"
:showPagination="false"
:showToolBar="false"
/>
</div>
</div>
</template>
</div>
<template #footer>
<el-button type="default" @click="showModal = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</template>
</vxe-modal>
</template>
<script setup lang="jsx" name="allocationModal">
import { computed } from 'vue';
import dayjs from 'dayjs';
import { reactive, ref } from 'vue';
import { getAppEnvConfig } from '@/utils/env';
const envs = getAppEnvConfig();
const data = ref([]);
const mytransfer = ref();
const tabledata = ref([]);
const url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/upload';
const showModal = ref(false);
const currentInfo = ref({ title: '结清减免还款', case: 0, money: 0 });
const form = reactive({
name: '',
files: [],
datetime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
});
const radio = ref(0);
const step = ref(0);
const onHide = () => {
currentInfo.value = { title: '结清减免还款', case: 0, money: 0 };
};
const openModal = (account) => {
showModal.value = true;
currentInfo.value = { title: '分期还款', case: 44, money: 1111 };
step.value = 0;
radio.value = 0;
};
const submitForm = () => {
if (step.value || radio.value === 0) {
} else {
step.value = 1;
}
};
const handleRemove = (uploadFile, uploadFiles) => {
console.log(uploadFile, uploadFiles);
};
const handlePictureCardPreview = (uploadFile) => {
dialogImageUrl.value = uploadFile.url;
dialogVisible.value = true;
};
const options = [
{
value: 'Option1',
label: 'Option1',
},
{
value: 'Option2',
label: 'Option2',
},
{
value: 'Option3',
label: 'Option3',
},
{
value: 'Option4',
label: 'Option4',
},
{
value: 'Option5',
label: 'Option5',
},
];
const handleFileSuccess = (response, file, fileList) => {
console.log('888877', response, file, fileList);
};
const config = computed(() => {
return {
toolbarConfig: { enabled: false },
columns: [
{
field: 'code',
title: '案件ID',
},
{
field: 'code',
title: '借款机构',
},
{
field: 'code',
title: '剩余待还金额',
},
],
};
});
tabledata.value = [
{ name: 'admin', code: 'admin', role: 'superadmin', num: 1 },
{ name: 'account1', code: 'account1', role: 'user', num: 1 },
{ name: 'account2', code: 'account2', role: 'user', num: 1 },
{ name: 'account3', code: 'account3', role: 'user', num: 1 },
];
defineExpose({
openModal,
});
</script>
<style lang="scss" scoped>
.box-title {
font-weight: 600;
font-size: 18px;
color: #000000;
line-height: 45px;
border-bottom: 1px solid rgba(0, 0, 0, 0.06);
margin-bottom: 10px;
}
.mytable {
.el-form-item {
margin-right: 0;
}
table {
width: 100%;
border-collapse: collapse;
}
td {
border: 1px solid rgba(5, 5, 5, 0.06);
background: #fff;
padding: 8px;
width: 240px;
&.label {
width: 160px;
background: #f5f7f9;
}
}
}
.mypicture {
:deep(.el-upload--picture-card) {
width: 100px;
height: 100px;
}
}
</style>
<template>
<div class="card table-box">
<div class="navigation-box absolute z-10 right-8 w-52 rounded-md pl-10 bg-white text-sm">
<el-affix :offset="140">
<el-affix :offset="140" style="width: 100% !important">
<div @click="anchor('baseinfo')" class="anchor-item">案人基本信息</div>
<div @click="anchor('caserelation')" class="anchor-item">案件联系人</div>
<div @click="anchor('casedetail')" class="anchor-item">案件明细</div>
......@@ -32,20 +32,24 @@
<div class="box-title">案人基本信息</div>
<div class="box-content">
<table>
<tbody>
<tr>
<td class="label">姓名</td>
<td>John Doe</td>
<td>{{ detail?.borrower?.name }}</td>
<td class="label">电话</td>
<td>30</td>
<td>{{ detail?.borrower?.phone }}</td>
<td class="label">户籍区域</td>
<td>30</td>
<td>{{
detail?.borrower?.domicileCity + ',' + detail?.borrower?.domicileProvince
}}</td>
</tr>
<tr>
<td class="label">证件号</td>
<td>johndoe@example.com</td>
<td>{{ detail?.borrower?.idCard }}</td>
<td class="label">户籍地址</td>
<td colspan="3">johndoe@example.com</td>
<td colspan="3">{{ detail?.borrower?.address }}</td>
</tr>
</tbody>
<!-- Add more rows as needed -->
</table>
</div>
......@@ -55,7 +59,7 @@
<div class="box-content">
<ProTable
:config="relationConfig"
:data="relationData"
:data="detail?.borrower?.guarantors"
:showPagination="false"
:showToolBar="false"
/>
......@@ -67,37 +71,45 @@
<el-button type="primary" @click="foldCaseTree">展开/折叠 </el-button>
</div>
<div class="box-content">
<vxe-grid v-bind="caseDetailConfig" ref="caseDetailRef">
<vxe-grid
v-bind="caseDetailConfig"
:show-footer="true"
ref="caseDetailRef"
@cell-click="onCellCase"
>
<template #expand_content="{ row }">
<div class="expand-box">
<div>User Info</div>
<div class="expand-table">
<table>
<table
><tbody>
<tr>
<td>
<span class="label">User Name:</span>
<span>John Doe</span>
<span>{{ row?.borrower?.name }}</span>
</td>
<td>
<span class="label">Telephone:</span>
<span>John Doe</span>
<span>{{ row?.borrower?.phone }}</span>
</td>
<td>
<span class="label">Live:</span>
<span>John Doe</span>
<span>{{
row?.borrower?.domicileCity + ',' + row?.borrower?.domicileProvince
}}</span>
</td>
</tr>
<tr>
<td>
<span class="label">Remark:</span>
<span>John Doe</span>
<span>{{ row?.remark }}</span>
</td>
<td colspan="2">
<span class="label">Address:</span>
<span>John Doe</span>
<span>{{ row?.borrower?.address }}</span>
</td>
</tr>
<!-- Add more rows as needed -->
</tbody>
</table>
</div>
</div>
......@@ -110,7 +122,7 @@
>跟进记录
<!-- <el-select v-model="form.relation" placeholder="请选择">
<el-option
v-for="item in options"
v-for="item in caseDetailConfig.data"
:key="item.value"
:label="item.label"
:value="item.value"
......@@ -130,6 +142,7 @@
<div class="box-title">减免记录</div>
<div class="box-content">
<table style="margin-bottom: 10px">
<tbody>
<tr>
<td class="label">减免类型</td>
<td>John Doe</td>
......@@ -146,11 +159,12 @@
<td class="label">减免生效时间</td>
<td>johndoe@example.com</td>
</tr>
</tbody>
<!-- Add more rows as needed -->
</table>
<ProTable
:config="recordConfig"
:data="recordData"
:config="reduceConfig"
:data="reduceData"
:showPagination="false"
:showToolBar="false"
/>
......@@ -160,6 +174,7 @@
<div class="box-title">分期记录</div>
<div class="box-content">
<table style="margin-bottom: 10px">
<tbody>
<tr>
<td class="label">分期申请ID</td>
<td>John Doe</td>
......@@ -176,6 +191,7 @@
<td class="label">分期生效时间</td>
<td>johndoe@example.com</td>
</tr>
</tbody>
<!-- Add more rows as needed -->
</table>
<ProTable
......@@ -199,6 +215,7 @@
</div>
</div>
<repairModal ref="repairModalRef"></repairModal>
<returnModal ref="returnModalRef"></returnModal>
<reduceDrawer ref="reduceDrawerRef"></reduceDrawer>
<splitDrawer ref="splitDrawerRef"></splitDrawer>
<callDrawer ref="callDrawerRef"></callDrawer>
......@@ -207,23 +224,30 @@
<script setup lang="jsx" name="caseDetail">
import { useRoute } from 'vue-router';
import { reactive, ref } from 'vue';
import { reactive, ref, onBeforeMount } from 'vue';
import { ElButton } from 'element-plus';
import repairModal from './components/repairModal.vue';
import returnModal from './components/returnModal.vue';
import reduceDrawer from './components/reduceDrawer.vue';
import splitDrawer from './components/splitDrawer.vue';
import callDrawer from './components/callDrawer.vue';
const relationData = ref([]);
import { getCredit, getTrackRecordPage, getCreditPage } from '@/api/property';
const returnData = ref([]);
const recordData = ref([]);
const reduceData = ref([]);
const detail = ref({
borrower: {
guarantors: [],
},
});
const caseDetailRef = ref();
const returnModalRef = ref();
const repairModalRef = ref();
const splitDrawerRef = ref();
const callDrawerRef = ref();
const reduceDrawerRef = ref();
const route = useRoute();
const detail = JSON.parse(route.query.item);
console.log('detail', detail);
const activeStep = ref(2);
const stepList = ref([
{ title: '已分派', desc: 'sadas' },
......@@ -231,7 +255,10 @@
{ title: '还款中', desc: 'sadas1' },
]);
const callTelephone = (row) => {
callDrawerRef.value.openModal(JSON.parse(JSON.stringify(detail)));
callDrawerRef.value.openModal(
JSON.parse(JSON.stringify(row)),
JSON.parse(JSON.stringify(detail.value))
);
};
const returnConfig = reactive({
columns: [
......@@ -273,35 +300,45 @@
const recordConfig = reactive({
columns: [
{
field: 'code',
field: 'id',
title: '跟进记录ID',
},
{
field: 'code',
field: 'trackTime',
title: '跟进日期',
},
{
field: 'code',
field: 'nextTime',
title: '下次跟进时间',
},
{
field: 'code',
title: '联系人姓名',
slots: {
default: ({ row }) => {
return <>{row?.credit?.borrower?.name}</>;
},
},
},
{
field: 'code',
title: '联系人号码',
slots: {
default: ({ row }) => {
return <>{row?.credit?.borrower?.phone}</>;
},
},
},
{
field: 'code',
title: '拨打跟进结果',
},
{
field: 'code',
field: 'phoneResultStatus',
title: '拨打处置状态',
},
{
field: 'code',
field: 'remark',
title: '备注',
},
{
......@@ -330,11 +367,11 @@
columns: [
{ type: 'seq', width: 70 },
{
field: 'code',
field: 'name',
title: '联系人姓名',
},
{
field: 'code',
field: 'kinship',
title: '与债权人关系',
},
{
......@@ -342,8 +379,13 @@
title: '号码类型',
},
{
field: 'code',
field: 'phone',
title: '号码',
slots: {
default: ({ row }) => {
return <>{row.phone + ' ' + (row.status === 'Y' ? '有效' : '无效')}</>;
},
},
},
{
field: 'code',
......@@ -352,6 +394,7 @@
default: ({ row, rowIndex }) => {
return (
<>
{/* <ElButton type="primary" onClick={() => callTelephone(row)} disabled={row.status !== 'Y'}> */}
<ElButton type="primary" onClick={() => callTelephone(row)}>
拨打跟进
</ElButton>
......@@ -363,21 +406,23 @@
],
toolbarConfig: { enabled: false },
});
const returnCrash = (row) => {};
const returnCrash = (row) => {
returnModalRef.value.openModal(JSON.parse(JSON.stringify(row)));
};
const repair = () => {
repairModalRef.value.openModal(JSON.parse(JSON.stringify(detail)));
repairModalRef.value.openModal(JSON.parse(JSON.stringify(detail.value)));
};
const reduce = () => {
reduceDrawerRef.value.openModal(JSON.parse(JSON.stringify(detail)));
reduceDrawerRef.value.openModal(JSON.parse(JSON.stringify(detail.value)));
};
const split = () => {
splitDrawerRef.value.openModal(JSON.parse(JSON.stringify(detail)));
splitDrawerRef.value.openModal(JSON.parse(JSON.stringify(detail.value)));
};
const caseDetailConfig = reactive({
columns: [
{ type: 'expand', width: 80, slots: { content: 'expand_content' } },
{
field: 'code',
field: 'id',
title: '案件ID',
},
{
......@@ -428,8 +473,24 @@
],
toolbarConfig: { enabled: false },
});
console.log('sada', detail.value?.borrower?.idCard);
const getTrackRecordList = (id) => {
getTrackRecordPage({
current: 1,
size: 9999999,
creditId: id,
}).then((res) => {
if (res.result && res.result.content) {
recordData.value = res.result.content;
}
});
};
const onCellCase = ({ row, rowIndex }) => {
getTrackRecordList(row.id);
};
const anchor = (type) => {
console.log('sadasda0', type);
document.querySelector(`#${type}`).scrollIntoView(true);
};
const foldCaseTree = () => {
......@@ -439,24 +500,90 @@
caseDetailRef.value?.setAllRowExpand(true);
}
};
const reduceConfig = reactive({
columns: [
{
field: 'code',
title: '跟进记录ID',
},
{
field: 'code',
title: '跟进日期',
},
{
field: 'code',
title: '下次跟进时间',
},
{
field: 'code',
title: '联系人姓名',
},
{
field: 'code',
title: '联系人号码',
},
{
field: 'code',
title: '拨打跟进结果',
},
{
field: 'code',
title: '拨打处置状态',
},
{
field: 'code',
title: '备注',
},
{
field: 'code',
title: '通话录音',
},
{
field: 'code',
title: '微信图片附件',
slots: {
default: ({ row, rowIndex }) => {
return (
<>
<ElButton type="primary" link onClick={() => callTelephone(row)}>
下载
</ElButton>
</>
);
},
},
},
],
toolbarConfig: { enabled: false },
});
recordData.value = [
{ name: 'admin', code: 'admin', role: 'superadmin', num: 1 },
{ name: 'account1', code: 'account1', role: 'user', num: 1 },
{ name: 'account2', code: 'account2', role: 'user', num: 1 },
{ name: 'account3', code: 'account3', role: 'user', num: 1 },
];
relationData.value = [
{ name: 'admin', code: 'admin', role: 'superadmin', num: 1 },
{ name: 'account1', code: 'account1', role: 'user', num: 1 },
{ name: 'account2', code: 'account2', role: 'user', num: 1 },
{ name: 'account3', code: 'account3', role: 'user', num: 1 },
];
returnData.value = [
{ name: 'admin', code: 'admin', role: 'superadmin', num: 1 },
{ name: 'account1', code: 'account1', role: 'user', num: 1 },
{ name: 'account2', code: 'account2', role: 'user', num: 1 },
{ name: 'account3', code: 'account3', role: 'user', num: 1 },
];
onBeforeMount(async () => {
const id = JSON.parse(route.query.id);
const { result } = await getCredit(id);
detail.value = result;
console.log('resultresult', detail.value);
getTrackRecordList(detail.value?.id);
if (detail.value?.borrower?.idCard) {
getCreditPage({ current: 1, size: 99999999, idCard: detail.value?.borrower?.idCard }).then(
(res) => {
if (res.result && res.result.content) {
caseDetailConfig.data = res.result.content;
}
}
);
}
});
</script>
<style lang="scss" scoped>
......
<template>
<div class="card content-box">
<div class="table-inner">
<ProTable :config="config" :data="data" ref="caseLRef">
<template #table_top>
<ProTable :config="config" ref="caseLRef" :api="getCreditPage">
<!-- <ProTable :config="config" ref="caseLRef" :data="data"> -->
<!-- <template #table_top>
<div class="topgrp">
<div class="topbox">
<div class="topinner">
......@@ -11,105 +12,145 @@
</div>
</div>
</div>
</template>
</template> -->
</ProTable>
</div>
<caseModal ref="caseModalRef" />
</div>
</template>
<script setup name="case-manage">
<script setup name="case-manage" lang="jsx">
import caseModal from './components/caseModal.vue';
import { useRouter } from 'vue-router';
import { reactive, ref } from 'vue';
import { getCreditPage } from '@/api/property';
const caseModalRef = ref();
const caseLRef = ref();
import { onMounted } from 'vue';
const router = useRouter();
const options = ref([]);
const onCellClick = ({ row, rowIndex }) => {
let obj = JSON.stringify(row);
router.push({
path: '/property/case-detail',
query: { item: obj }, //这里不能直接写成 query: JSON.stringify(item)
query: { id: row.id }, //这里不能直接写成 query: JSON.stringify(item)
});
};
const config = reactive({
columns: [
{ field: 'name', title: '案件ID', search: { el: 'input' } },
{ field: 'id', title: '案件ID', search: { el: 'input' }, width: 80 },
{
field: 'code',
title: '借款机构',
width: 100,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'code',
title: '资管公司',
width: 100,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
title: '借款人姓名',
search: { el: 'input', props: { clearable: true } },
width: 120,
search: {
el: 'input',
props: { clearable: true },
slots: {
default: ({ row }) => {
return <>{row?.borrower?.name}</>;
},
},
},
},
{
field: 'role',
title: '身份证',
search: { el: 'input', props: { clearable: true } },
width: 140,
search: {
el: 'input',
props: { clearable: true },
slots: {
default: ({ row }) => {
return <>{row?.borrower?.idCard}</>;
},
},
},
},
{
field: 'role',
title: '手机号',
search: { el: 'input', props: { clearable: true } },
width: 140,
search: {
el: 'input',
props: { clearable: true },
slots: {
default: ({ row }) => {
return <>{row?.borrower?.phone}</>;
},
},
},
},
{
field: 'role',
field: 'loanAmount',
title: '委案金额',
width: 80,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
title: '累计还款金额',
width: 110,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
title: '累计减免金额',
width: 110,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
title: '剩余待还金额',
width: 110,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
title: 'CPE',
width: 80,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
title: '分配CPE日期',
width: 110,
search: { el: 'date-picker', props: { type: 'date', valueFormat: 'YYYY-MM-DD' } },
},
{
field: 'role',
field: 'principalBalance',
title: '本金余额',
width: 80,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
field: 'debitInterest',
title: '欠息额',
width: 80,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
field: 'commission',
title: '手续费',
width: 80,
search: { el: 'input', props: { clearable: true } },
},
{
field: 'role',
title: '跟进结果',
width: 80,
enum: options,
search: { el: 'select', props: { filterable: true }, span: 1 },
fieldNames: { label: 'genderLabel', value: 'genderValue' },
......@@ -117,13 +158,15 @@
{
field: 'role',
title: '跟进状态',
width: 80,
enum: options,
search: { el: 'select', props: { filterable: true }, span: 1 },
fieldNames: { label: 'genderLabel', value: 'genderValue' },
},
{
field: 'role',
field: 'creditStatus',
title: '案件状态',
width: 80,
enum: options,
search: { el: 'select', props: { filterable: true }, span: 1 },
fieldNames: { label: 'genderLabel', value: 'genderValue' },
......@@ -141,12 +184,11 @@
console.log('111', caseLRef.value.element.getCheckboxRecords());
caseModalRef.value.openModal(JSON.parse(JSON.stringify(row)));
};
const data = [
{ name: 'admin', code: 'admin', role: 'superadmin' },
{ name: 'account1', code: 'account1', role: 'user' },
{ name: 'account2', code: 'account2', role: 'user' },
{ name: 'account3', code: 'account3', role: 'user' },
];
const query = () => caseLRef.value?.search();
onMounted(() => {
query();
});
</script>
<style lang="scss" scoped>
.table-inner {
......
<template>
<div class="table-box">
<div class="card flex mb-2">
<div class="flex-1">
<div class="flex-1 pr-3">
<div class="mb-1">1、上传文件</div>
<div>
<el-upload
......@@ -12,7 +12,8 @@
accept=".xls, .xlsx"
:limit="1"
:on-success="handleFileSuccess"
:auto-upload="false"
:on-remove="handleRemove"
:auto-upload="true"
:on-progress="uploadVideoProcess"
>
<el-button type="primary" plain :icon="Upload">上传文件</el-button>
......@@ -27,7 +28,7 @@
<div class="mb-1">2、检查数据</div>
<div>
<div class="flex items-center">
<el-button type="danger">检查</el-button>
<el-button type="danger" :disabled="!form.path" @click="checkData">检查</el-button>
<span class="ml-2"> 通过 </span>
</div>
<!-- 进度条 -->
......@@ -53,16 +54,16 @@
</el-select>
</el-form-item>
</el-form>
<el-button type="primary">上传</el-button>
<el-button type="primary" @click="submitData">上传</el-button>
</div>
</div>
</div>
<div>
<ProTable :config="config" :data="data">
<!-- 表格 header 按钮 -->
<template #left_buttons>
<!-- <template #left_buttons>
<el-button type="primary">新增菜单 </el-button>
</template>
</template> -->
</ProTable>
</div>
<caseDetailModal ref="caseDetailModalRef" />
......@@ -70,11 +71,14 @@
</template>
<script setup lang="jsx" name="import">
import { getAppEnvConfig } from '@/utils/env';
import caseDetailModal from './components/caseDetailModal.vue';
import { reactive, ref } from 'vue';
import { computed } from 'vue';
import { ElButton } from 'element-plus';
import { Upload, Delete } from '@element-plus/icons-vue';
const envs = getAppEnvConfig();
const progressFlag = ref(false);
const proTable = ref(undefined);
const options = ref([]);
......@@ -171,25 +175,31 @@
],
});
const form = reactive({
name: '',
path: '',
code: '',
role: '',
});
const upload = reactive({
// 是否禁用上传
isUploading: false,
// 设置上传的请求头部
// headers: { Authorization: "Bearer " + getToken() },
headers: {},
// 上传的地址
url: '/mes/dv/machinery/importData',
url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/upload',
});
console.log('upload', upload);
const uploadVideoProcess = (event, file, fileList) => {
upload.isUploading = true;
};
const checkData = () => {};
const submitData = () => {
uploadRef.value.clearFiles();
form.path = '';
};
const handleFileSuccess = (response, file, fileList) => {
form.path = response.message;
upload.isUploading = false;
uploadRef.value.clearFiles();
};
const handleRemove = () => {
form.path = '';
};
const linkZK = (row) => {
caseDetailModalRef.value.openModal(JSON.parse(JSON.stringify(row)));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment