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

业务审批

parent dcf0ca7f
<template> <template>
<el-drawer <el-drawer
v-model="showModal" v-model="showModal"
title="分期申请" :size="950"
:size="850"
direction="rtl" direction="rtl"
@close="showModal = false" @close="showModal = false"
:before-close="onHide" :before-close="onHide"
> >
<div class="h-full flex-col flex mydrawer pb-2"> <template #header="{ titleId, titleClass }">
<div> <h4 :id="titleId" :class="titleClass">分期审批
<ProTable <el-tag :type="currentDetail.flowStatus === 'pass' ? 'success' : currentDetail.flowStatus === 'fail' ? 'danger' : 'warning'">{{currentDetail.flowStatus
:config="config" ? FlowStatus?.find((v) => v.value === currentDetail.flowStatus)?.label
ref="ProTableRef" : ''}}</el-tag>
:data="tabledata" </h4>
:showPagination="false" </template>
:showToolBar="false" <div class="flex">
> <div class=" w-1/4 flex-shrink-0">
<template #table_top> <p class=" font-bold mb-3">审批进程</p>
<p class="font-bold">关联案件:</p> <div :class="{nopending: currentDetail.flowStatus !== 'pending'}">
</template> <el-timeline style="max-width: 600px">
</ProTable> <el-timeline-item
:timestamp="currentDetail?.applyDate"
color="#234ca3"
>
<p class=" font-bold text-sm">发起人</p>
<span class="text-xs bg-gray-200 rounded-sm text-slate-900 px-2">{{currentDetail?.cpe?.username}}</span>
</el-timeline-item>
<el-timeline-item
:timestamp="currentDetail?.createTime"
:color="currentDetail.flowStatus !== 'pending' ? '#234ca3' : null"
>
<p class=" font-bold text-sm">平台审批环节</p>
<span class="text-xs bg-gray-200 rounded-sm text-slate-900 px-2">{{currentDetail?.createBy}}</span>
</el-timeline-item>
</el-timeline>
</div>
</div> </div>
<div class="flex"> <div class="h-full w-3/4 flex-shrink-0 flex-col flex mydrawer pb-2">
<div class="mt-3 pr-8 w-2/5"> <div class="w-full">
<el-form <table>
ref="formRef" <tbody>
inline <tr>
:model="form" <td class="label">债务人</td>
:rules="rules" <td>{{ currentDetail?.borrower?.name }}</td>
label-width="110px" <td class="label">身份证号</td>
label-position="left" <td>{{ currentDetail?.borrower?.idCard }}</td>
> </tr>
<el-row> <tr>
<el-col :span="24"> <td class="label">产品</td>
<el-form-item class="w-full" label="剩余待还总额:" prop="name"> <td>
{{ form.remainingAmount }} <VxeTooltip
</el-form-item> :content="Array.from(new Set(currentDetail?.loans.map((v) => v.loanPlatform.name))).join(',')"
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="还款总额:" prop="code">
<el-input
v-model="form.totalRepayAmount"
placeholder="请输入"
@change="changePeriod"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="分期申请时间:" prop="code">
<el-date-picker
v-model="form.applyDate"
disabled
class="w-full"
format="YYYY-MM-DD HH:mm:ss"
value-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">
<el-select v-model="form.totalPeriod" disabled placeholder="请选择" @change="changePeriod">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="首期还款日:" prop="code">
<el-date-picker
@change="changePeriod"
disabled
class="w-full"
v-model="form.firstApplyDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="分期生效时间:" prop="code">
<el-date-picker
v-model="form.effectiveTime"
disabled
class="w-full"
format="YYYY-MM-DD HH:mm:ss"
value-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="code">
<el-upload
:action="url"
:headers="{timeout:180000}"
v-model:file-list="form.images"
disabled
list-type="picture-card"
ref="mypictureRef"
class="mypicture"
:on-preview="handlePictureCardPreview"
:on-success="handleFileSuccess1"
:on-remove="handleRemove1"
>
<div class="text-center">
<el-icon><Plus /></el-icon>
<div>附件</div>
</div>
<template #file="{ file }">
<img
class="el-upload-list__item-thumbnail"
:src="updataIf(file) ? getImageUrl() :file.url"
alt=""
> >
<span class="el-upload-list__item-actions"> <VxeTextEllipsis
<!-- <span :content="Array.from(new Set(currentDetail?.loans.map((v) => v.loanPlatform.name))).join(',')"
class="el-upload-list__item-delete" ></VxeTextEllipsis>
> </VxeTooltip>
<el-icon @click="handleRemove1(file)"> </td>
<Delete /> <td class="label">调解中心</td>
</el-icon> <td><VxeTooltip
</span> --> :content="currentDetail?.tenant?.name"
<span >
class="el-upload-list__item-preview" <VxeTextEllipsis
> :content="currentDetail?.tenant?.name"
<el-icon v-if="updataIf(file)" @click="download(file.url)"> ></VxeTextEllipsis>
<Download /> </VxeTooltip></td>
</el-icon> </tr>
<el-icon v-else @click="handlePictureCardPreview(file)"> <tr>
<ZoomIn /> <td class="label">申请CPE</td>
</el-icon> <td>{{ currentDetail?.cpe?.username }}</td>
</span> <td class="label">剩余待还金额</td>
</span> <td>{{ currentDetail?.remainingAmount }}</td>
</template> </tr>
</el-upload> </tbody>
</el-form-item> <!-- Add more rows as needed -->
</el-col> </table>
</el-row>
</el-form>
</div>
<div class="w-3/5">
<ProTable <ProTable
:config="splitconfig" :config="config"
:data="splitdata" ref="ProTableRef"
:data="tabledata"
:showPagination="false" :showPagination="false"
:showToolBar="false" :showToolBar="false"
> >
<template #table_top> <template #table_top>
<div class="flex justify-end"> <p class="font-bold my-2">关联案件:</p>
<el-button type="primary" @click="editOrConfirm" class="mr-1 my-2">{{
editFirst ? '确定' : '修改'
}}</el-button>
</div>
</template> </template>
</ProTable> </ProTable>
<div class="flex"> </div>
<div class="ml-auto text-gray-400">总计: {{ form.totalRepayAmount }}</div>
</div> </div>
</div>
<div class="flex">
<div class="mt-3 pr-8 w-2/5">
<el-form
ref="formRef"
inline
:model="form"
:rules="rules"
label-width="110px"
label-position="left"
>
<el-row>
<el-col :span="24">
<el-form-item class="w-full" label="剩余待还总额:" prop="name">
{{ form.remainingAmount }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="还款总额:" prop="code">
<el-input
v-model="form.totalRepayAmount"
:disabled="currentDetail.flowStatus !== 'pending'"
placeholder="请输入"
@change="changePeriod"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="分期申请时间:" prop="code">
<el-date-picker
v-model="form.applyDate"
disabled
class="w-full"
format="YYYY-MM-DD HH:mm:ss"
value-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">
<el-select v-model="form.totalPeriod" disabled placeholder="请选择" @change="changePeriod">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="首期还款日:" prop="code">
<el-date-picker
@change="changePeriod"
disabled
class="w-full"
v-model="form.firstApplyDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="w-full" label="分期生效时间:" prop="code">
<el-date-picker
v-model="form.effectiveTime"
disabled
class="w-full"
format="YYYY-MM-DD HH:mm:ss"
value-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="code">
<el-upload
:action="url"
:headers="{timeout:180000}"
v-if="showModal"
v-model:file-list="form.images"
disabled
list-type="picture-card"
ref="mypictureRef"
class="mypicture"
:on-preview="handlePictureCardPreview"
:on-success="handleFileSuccess1"
:on-remove="handleRemove1"
>
<div class="text-center">
<el-icon><Plus /></el-icon>
<div>附件</div>
</div>
<template #file="{ file }">
<img
class="el-upload-list__item-thumbnail"
:src="updataIf(file) ? getImageUrl() :file.url"
alt=""
>
<span class="el-upload-list__item-actions">
<!-- <span
class="el-upload-list__item-delete"
>
<el-icon @click="handleRemove1(file)">
<Delete />
</el-icon>
</span> -->
<span
class="el-upload-list__item-preview"
>
<el-icon v-if="updataIf(file)" @click="download(file.url)">
<Download />
</el-icon>
<el-icon v-else @click="handlePictureCardPreview(file)">
<ZoomIn />
</el-icon>
</span>
</span>
</template>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div class="w-3/5">
<ProTable
:config="splitconfig"
:data="splitdata"
:showPagination="false"
:showToolBar="false"
>
<template #table_top>
<div class="flex justify-end">
<el-button type="primary" @click="editOrConfirm" class="mr-1 my-2" v-if="currentDetail.flowStatus === 'pending'">{{
editFirst ? '确定' : '修改'
}}</el-button>
</div>
</template>
</ProTable>
<div class="flex">
<div class="ml-auto text-gray-400">总计: {{ form.totalRepayAmount }}</div>
</div> </div>
</div> </div>
</div> </div>
<template #footer> <template #footer>
<div style="flex: auto"> <div style="flex: auto">
<el-button @click="showModal = false">取消</el-button> <el-button @click="showModal = false">取消</el-button>
<el-button type="primary" @click="submitForm('fail')">不通过</el-button> <el-button type="primary" @click="submitForm('fail')" v-if="currentDetail.flowStatus === 'pending'">不通过</el-button>
<el-button type="primary" @click="submitForm('pass')">通过</el-button> <el-button type="primary" @click="submitForm('pass')" v-if="currentDetail.flowStatus === 'pending'">通过</el-button>
</div> </div>
</template> </template>
<el-dialog v-model="dialogVisible"> <el-dialog v-model="dialogVisible">
...@@ -183,6 +252,10 @@ ...@@ -183,6 +252,10 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { computed } from 'vue'; import { computed } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { Close } from '@element-plus/icons-vue';
import { VxeTextEllipsis, VxeTooltip } from 'vxe-pc-ui';
import { ElInputNumber, ElMessage } from 'element-plus'; import { ElInputNumber, ElMessage } from 'element-plus';
import { changeAmount } from '@/api/property'; import { changeAmount } from '@/api/property';
import { getByIdPlatforms } from '@/api/platform'; import { getByIdPlatforms } from '@/api/platform';
...@@ -401,36 +474,43 @@ ...@@ -401,36 +474,43 @@
{ {
field: 'caseId', field: 'caseId',
title: '案件ID', title: '案件ID',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
{ {
field: 'product', field: 'product',
title: '产品', title: '产品',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
{ {
field: 'loanPlatform.name', field: 'loanPlatform.name',
title: '借款平台', title: '借款平台',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
{ {
field: 'commissionAmount', field: 'commissionAmount',
title: '委案金额', title: '委案金额',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
{ {
field: 'sumReductionAmount', field: 'sumReductionAmount',
title: '累计减免金额', title: '累计减免金额',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
{ {
field: 'sumRepayAmount', field: 'sumRepayAmount',
title: '累计还款金额', title: '累计还款金额',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
{ {
field: 'remainingAmount', field: 'remainingAmount',
title: '剩余待还金额', title: '剩余待还金额',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
], ],
...@@ -496,7 +576,6 @@ ...@@ -496,7 +576,6 @@
currentDetail.value = detail; currentDetail.value = detail;
console.log('currentDetail', currentDetail.value, caselist); console.log('currentDetail', currentDetail.value, caselist);
form.totalRepayAmount = 0; form.totalRepayAmount = 0;
form.images = [];
form.totalPeriod = detail.totalPeriod form.totalPeriod = detail.totalPeriod
form.applyDate = detail.applyDate form.applyDate = detail.applyDate
form.firstApplyDate = detail.firstApplyDate form.firstApplyDate = detail.firstApplyDate
...@@ -592,4 +671,42 @@ ...@@ -592,4 +671,42 @@
font-size: 12px; font-size: 12px;
} }
} }
.nopending {
:deep(.el-timeline-item__tail) {
border-color: #234ca3;
}
}
table {
width: 100%;
margin-top: 10px;
border-collapse: collapse;
}
td {
border: 1px solid rgba(5, 5, 5, 0.06);
background: #fff;
color: #606268;
width: 240px;
line-height: 11px;
height: 40px;
font-size: 14px;
padding-left: 5px;
&.label {
text-align: center;
background: #f6f8ff;
font-weight: bold;
color: #909399;
}
}
</style>
<style lang="scss">
.el-drawer .el-drawer__header .el-tag--warning .el-tag__content {
color: var(--el-color-warning) !important;
}
.el-drawer .el-drawer__header .el-tag--success .el-tag__content {
color: var(--el-color-success) !important;
}
.el-drawer .el-drawer__header .el-tag--danger .el-tag__content {
color: var(--el-color-danger) !important;
}
</style> </style>
...@@ -17,116 +17,7 @@ ...@@ -17,116 +17,7 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<ProTable :config="config" ref="ProTableRef" :api="getByStagesPage" :selectdList="selectdList" :paramCallback="paramCallback"> <ProTable :config="config" ref="ProTableRef" :api="getByStagesPage" :paramCallback="paramCallback">
<template #left_buttons>
<!-- <el-button type="primary">下载申请 </el-button> -->
<el-button
type="primary"
@click="changeStatus"
:disabled="!selectdList || !selectdList.length"
>审批
</el-button>
<!-- <el-button type="primary">下载 </el-button>
<el-button type="primary">批量修复上传 </el-button> -->
</template>
<template #expand_content="{ row }">
<div class="expand-box">
<div class="flex">
<div class="w-2/3 pr-2">
<div>案件明细</div>
<div class="expand-table">
<div v-for="(item, index) in row.loans" :key="index">
<div class="public-header">
{{ item?.caseId }}
</div>
<table
><tbody>
<tr>
<td class="label">案件ID</td>
<td>{{ item?.caseId }}</td>
<td class="label">借款平台</td>
<td>{{ item?.loanPlatform?.name }}</td>
</tr>
<tr>
<td class="label">资管公司</td>
<td>{{ item?.manageOrg.orgName }}</td>
<td class="label">身份证</td>
<td>{{ item?.borrower?.idCard }}</td>
</tr>
<tr>
<td class="label">手机号</td>
<td>{{ item?.borrower?.phone }}</td>
<td class="label">折扣</td>
<td>{{ item?.discount }}</td>
</tr>
<tr>
<td class="label">累计还款金额</td>
<td>{{ item?.sumRepayAmount }}</td>
<td class="label">累计减免金额</td>
<td>{{ item?.sumReductionAmount }}</td>
</tr>
<tr>
<td class="label">剩余待还金额</td>
<td>{{ item?.remainingAmount }}</td>
<td class="label">CPE</td>
<td>{{ item?.cpe?.username }}</td>
</tr>
<tr>
<td class="label">分派CPE日期</td>
<td>{{ item?.cpeDate }}</td>
<td class="label">本金余额</td>
<td>{{ item?.principalBalance }}</td>
</tr>
<tr>
<td class="label">手续费</td>
<td>{{ item?.commission }}</td>
</tr>
<tr>
<td class="label">委案金额</td>
<td>{{ item?.commissionAmount }}</td>
<td class="label">案件状态</td>
<td>
{{
item?.caseStatus
? CaseStatus.find((v) => v.value === item?.caseStatus)?.label
: ''
}}</td
>
</tr>
<tr>
<td class="label">跟进结果</td>
<td>{{
item?.followStatus
? FollowStatus.find((v) => v.value === item?.followStatus)?.label
: ''
}}</td>
<td class="label">跟进状态</td>
<td>{{
item?.phoneResultStatus
? PhoneResultStatus.find((v) => v.value === item?.phoneResultStatus)
.label
: ''
}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="flex-1">
<div>分期明细</div>
<div class="expand-table">
<ProTable
:config="splitDeConfig"
:data="row.byStagesRecords"
:showPagination="false"
:showToolBar="false"
/>
</div>
</div>
</div>
</div>
</template>
</ProTable> </ProTable>
<vxe-modal <vxe-modal
resize resize
...@@ -263,15 +154,10 @@ ...@@ -263,15 +154,10 @@
], ],
toolbarConfig: { enabled: false }, toolbarConfig: { enabled: false },
}); });
const changeStatus = async () => { const changeStatus = async (row) => {
if (selectdList.value.length > 1) { splitDrawerRef.value.openModal(
showModal.value = true; JSON.parse(JSON.stringify(row))
} else { );
splitDrawerRef.value.openModal(
JSON.parse(JSON.stringify(selectdList.value[0]))
);
}
}; };
const submitForm = async (type) => { const submitForm = async (type) => {
const ids = selectdList.value.map((v) => v.id).join(','); const ids = selectdList.value.map((v) => v.id).join(',');
...@@ -299,8 +185,8 @@ ...@@ -299,8 +185,8 @@
const config = computed(() => { const config = computed(() => {
return { return {
columns: [ columns: [
{ type: 'checkbox', width: 60, fixed: 'left' }, // { type: 'checkbox', width: 60, fixed: 'left' },
{ type: 'expand', width: 80, slots: { content: 'expand_content' } }, // { type: 'expand', width: 80, slots: { content: 'expand_content' } },
{ {
field: 'caseId', field: 'caseId',
title: '案件ID', title: '案件ID',
...@@ -334,7 +220,7 @@ ...@@ -334,7 +220,7 @@
width: 90, width: 90,
}, },
{ {
title: 'CPE', title: '发起人',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 60, width: 60,
slots: { slots: {
...@@ -469,6 +355,22 @@ ...@@ -469,6 +355,22 @@
}, },
}, },
}, },
{
field: 'code',
title: '操作',
width: 120,
slots: {
default: ({ row, rowIndex }) => {
return (
<>
<ElButton type="primary" onClick={() => changeStatus(row)}>
{row.flowStatus === 'pending' ? '查看并审核' : '查看'}
</ElButton>
</>
);
},
},
}
], ],
onCheckboxChange: onCheckboxChange, onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll, onCheckboxAll: onCheckboxAll,
......
<template>
<el-drawer
v-model="showModal"
:size="950"
class="overflow-hidden1"
@close="showModal = false"
direction="rtl"
:before-close="onHide"
>
<template #header="{ titleId, titleClass }">
<h4 :id="titleId" :class="titleClass">减免审批
<el-tag :type="currentDetail.flowStatus === 'pass' ? 'success' : currentDetail.flowStatus === 'fail' ? 'danger' : 'warning'">{{currentDetail.flowStatus
? FlowStatus?.find((v) => v.value === currentDetail.flowStatus)?.label
: ''}}</el-tag>
</h4>
</template>
<div class="h-full flex-col flex mydrawer">
<div class="flex">
<div class=" w-1/4 pl-1 flex-shrink-0 after-border">
<p class=" font-bold mb-3">审批进程</p>
<div :class="{nopending: currentDetail.flowStatus !== 'pending'}">
<el-timeline style="max-width: 600px">
<el-timeline-item
:timestamp="currentDetail?.createTime"
color="#234ca3"
>
<p class=" font-bold text-sm">发起人</p>
<span class="text-xs bg-gray-200 rounded-sm text-slate-900 px-2">{{currentDetail?.cpe?.username}}</span>
</el-timeline-item>
<el-timeline-item
:timestamp="currentDetail?.createTime"
:color="currentDetail.flowStatus !== 'pending' ? '#234ca3' : null"
>
<p class=" font-bold text-sm">平台审批环节</p>
<span class="text-xs bg-gray-200 rounded-sm text-slate-900 px-2">{{currentDetail?.createBy}}</span>
</el-timeline-item>
</el-timeline>
</div>
</div>
<el-form
class="pl-3"
ref="formRef"
inline
:model="form"
:rules="rules"
label-width="110px"
label-position="left"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item class="w-full" label="姓名:" prop="name" label-width="120px">
{{ currentDetail?.borrower?.name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="证件号:" prop="name" label-width="120px">
{{ currentDetail?.borrower?.idCard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="产品:" prop="name" label-width="120px">
{{Array.from(new Set(currentDetail?.reduceRecords.map((v) => v?.loan?.loanPlatform.name))).join(',')}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="调解中心:" prop="name" label-width="120px">
{{Array.from(new Set(currentDetail?.reduceRecords.map((v) => v.loan?.tenant?.name))).join(',')}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="申请CPE:" prop="name" label-width="120px">
{{ currentDetail?.cpe?.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="申请时间:" prop="name" label-width="120px">
{{ currentDetail?.createTime }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="减免截止时间:" prop="code">
<el-date-picker v-model="form.applyDate" type="datetime" disabled />
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item class="w-full" label="减免到期时间:" prop="code">
<el-date-picker v-model="form.datetime" type="datetime" />
</el-form-item>
</el-col> -->
<el-col :span="12">
<el-form-item class="w-full" label="减免金额(总计):" prop="name" label-width="120px">
{{ form.totalReduceAmount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="减免案件数:" prop="role">{{
form.totalNumber
}}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="应还金额:" prop="relation">
{{ form.remainingAmount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="减免原因:" prop="code">
<el-input v-model="form.applyDate" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="委案金额:" prop="relation">
{{ form.commissionAmount }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="备注:" prop="code">
<el-input v-model="form.applyDate" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="w-full" label="附件" prop="code">
<el-upload
:action="url"
:headers="{timeout:180000}"
list-type="picture-card"
v-if="showModal"
v-model:file-list="form.images"
ref="mypictureRef"
disabled
class="mypicture"
:on-preview="handlePictureCardPreview"
:on-success="handleFileSuccess1"
:on-remove="handleRemove1"
>
<div class="text-center">
<el-icon><Plus /></el-icon>
<div>附件</div>
</div>
<template #file="{ file }">
<img
class="el-upload-list__item-thumbnail"
:src="updataIf(file) ? getImageUrl() :file.url"
alt=""
>
<span class="el-upload-list__item-actions">
<!-- <span
class="el-upload-list__item-delete"
>
<el-icon @click="handleRemove1(file)">
<Delete />
</el-icon>
</span> -->
<span
class="el-upload-list__item-preview"
>
<el-icon v-if="updataIf(file)" @click="download(file.response.message)">
<Download />
</el-icon>
<el-icon v-else @click="handlePictureCardPreview(file)">
<ZoomIn />
</el-icon>
</span>
</span>
</template>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div>
<ProTable
:config="config"
ref="ProTableRef"
:data="tabledata"
:showPagination="false"
:dataCallback="dataCallback"
:showToolBar="false"
>
<template #table_top>
<p class="font-bold">关联案件:</p>
</template>
</ProTable>
</div>
</div>
<template #footer>
<div style="flex: auto">
<el-button @click="showModal = false">取消</el-button>
<el-button type="primary" @click="submitForm('fail')">不通过</el-button>
<el-button type="primary" @click="submitForm('pass')">通过</el-button>
</div>
</template>
<el-dialog v-model="dialogVisible">
<img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
</el-drawer>
</template>
<script setup lang="jsx" name="reduceDrawer">
import dayjs from 'dayjs';
import { computed } from 'vue';
import { reactive, ref } from 'vue';
import { saveReduce } from '@/api/property';
import { ElMessage } from 'element-plus';
import { Download, ZoomIn } from '@element-plus/icons-vue';
import { onMounted } from 'vue';
import { watch } from 'vue';
import Decimal from 'decimal.js';
import { getAppEnvConfig } from '@/utils/env';
import { useDict } from '@/hooks/useDict';
import { inject } from 'vue';
const envs = getAppEnvConfig();
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus");
const emits = defineEmits(['success']);
const url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/upload';
const showModal = ref(false);
const tabledata = ref([]);
const ProTableRef = ref();
const mypictureRef = ref();
const dialogImageUrl = ref('');
const dialogVisible = ref(false);
const downloadfile = inject('download');
const form = reactive({
totalReduceAmount: 0,
totalNumber: '',
images: [],
reduceType: 'settle',
commissionAmount: 0,
remainingAmount: 0,
applyDate: dayjs().format('YYYY-MM-DD HH:mm:ss'),
});
const props = defineProps({
mergerCase: String,
});
const selectdList = ref([]);
const onCheckboxChange = (row) => {
selectdList.value = row.records;
form.totalNumber = row.records.length;
form.totalReduceAmount = 0;
form.remainingAmount = 0;
selectdList.value.forEach((item) => {
form.totalReduceAmount = Decimal(form.totalReduceAmount).add(
Decimal(Number(item.reduceAmount) || 0)
);
form.remainingAmount = Decimal(form.remainingAmount).add(
Decimal(Number(item.payAmount) || 0)
);
});
};
const handlePictureCardPreview = (uploadFile) => {
dialogImageUrl.value = uploadFile.url;
dialogVisible.value = true;
};
// 判断文件类型,图片预览,文件下载
const updataIf = (e) => {
console.log('eeee', e)
if (e.fileName) {
if (e.fileName.split('.')[1] === 'png' || e.fileName.split('.')[1] === 'jpeg' || e.fileName.split('.')[1] === 'jpg') {
return false
} else {
return true
}
} else {
if (e.name.split('.')[1] === 'png' || e.name.split('.')[1] === 'jpeg' || e.name.split('.')[1] === 'jpg') {
return false
} else {
return true
}
}
}
const handleRemove1 = (uploadFile) => {
const index = form.images.findIndex((v) => v.name === uploadFile.name);
form.images.splice(index, 1);
};
const download = (item) => {
const name = item.slice(item.lastIndexOf('/') + 1, item.length);
downloadfile('/sys/static/' + item, {}, name);
};
const handleFileSuccess1 = (response, file, fileList) => {
if (file.uid) {
const item = form.images.find((v) => v.uid === file.uid);
item.url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + response.message;
}
};
const getImageUrl = () => {
return new URL(`@/assets/images/file.svg`, import.meta.url).href;
}
const onCheckboxAll = (flag) => {
if (flag.checked) {
selectdList.value = flag.records;
form.totalNumber = flag.records.length;
} else {
selectdList.value = [];
form.totalNumber = 0;
}
form.totalReduceAmount = 0;
form.remainingAmount = 0;
selectdList.value.forEach((item) => {
form.totalReduceAmount = Decimal(form.totalReduceAmount).add(
Decimal(Number(item.reduceAmount) || 0)
);
form.remainingAmount = Decimal(form.remainingAmount).add(
Decimal(Number(item.payAmount) || 0)
);
});
};
const currentDetail = ref({});
const onHide = (done) => {
done();
};
const config = reactive({
checkboxConfig: {
checkMethod: ({ row }) => {
return false;
},
},
minHeight: 200,
columns: [
{ type: 'checkbox', title: '', width: '40px',fixed: 'left' },
{
field: 'loan.caseId',
width: 100,
showOverflow: 'tooltip',
title: '案件ID',
},
{
field: 'loan.product',
width: 100,
showOverflow: 'tooltip',
title: '产品',
},
{
field: 'loan.loanPlatform.name',
showOverflow: 'tooltip',
title: '借款平台',
width: 90,
},
{
field: 'loan.commissionAmount',
showOverflow: 'tooltip',
width: 90,
title: '委案金额',
},
{
field: 'loan.sumReductionAmount',
showOverflow: 'tooltip',
width: 100,
title: '累计减免金额',
},
{
field: 'loan.sumRepayAmount',
showOverflow: 'tooltip',
width: 100,
title: '累计还款金额',
},
{
field: 'reduceAmount',
showOverflow: 'tooltip',
width: 100,
title: '减免金额',
slots: {
default: ({ row, rowIndex }) => {
return (
<>
<ElInput v-model={row.reduceAmount} disabled onChange={() => changeNum(row, rowIndex)} />
</>
);
},
},
},
{
field: 'loan.remainingAmount',
showOverflow: 'tooltip',
width: 166,
title: '剩余待还金额(减免前)',
},
{
field: 'payAmount',
showOverflow: 'tooltip',
width: 140,
title: '应还金额(减免后)',
},
],
onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll,
toolbarConfig: { enabled: false },
});
const changeNum = (row) => {
row.payAmount = Decimal(row.loan.remainingAmount).sub(Decimal(row.reduceAmount));
form.totalReduceAmount = 0;
form.remainingAmount = 0;
selectdList.value.forEach((item) => {
form.totalReduceAmount = Decimal(form.totalReduceAmount).add(
Decimal(Number(item.reduceAmount) || 0)
);
form.remainingAmount = Decimal(form.remainingAmount).add(
Decimal(Number(item.payAmount) || 0)
);
});
};
const openModal = (detail) => {
const caselist = detail.reduceRecords
showModal.value = true;
currentDetail.value = detail;
form.totalReduceAmount = detail.totalReduceAmount;
form.remainingAmount = Decimal(detail.remainingAmount).sub(Decimal(detail.totalReduceAmount));
form.applyDate = detail.applyDate
const list = [];
form.images = detail.images
? detail.images.map((v) => ({
name: v.slice(v.lastIndexOf('/') + 1, v.length),
url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v,
}))
: [];
caselist.forEach((item) => {
item['payAmount'] = Decimal(item.loan.remainingAmount).sub(Decimal(item.reduceAmount));
form['commissionAmount'] = Decimal(form['commissionAmount']).add(Decimal(item.loan.commissionAmount))
});
tabledata.value = caselist;
form.totalNumber = detail.totalNumber;
setTimeout(() => {
if (ProTableRef.value.element) {
ProTableRef.value.element.setAllCheckboxRow(true);
selectdList.value = list;
}
}, 500);
};
const submitForm = (type) => {
const list = JSON.parse(JSON.stringify(selectdList.value));
list.forEach((item) => {
delete item.payAmount;
});
let images = JSON.parse(JSON.stringify(form.images.map((v) => v.url)));
images = images.map((v) => {
return v.replace(envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/', '');
});
const params = {
borrower: currentDetail.value.borrower,
askForStatus: 'Pending',
flowStatus: type,
...form,
images: images.length > 0 ? images : null,
reduceRecords: list,
};
delete params.id;
delete params.cpe;
saveReduce(params).then((res) => {
if (res.success) {
ElMessage.success({
message: '保存成功',
plain: true,
});
showModal.value = false;
emits('success');
}
});
};
defineExpose({
openModal,
});
</script>
<style lang="scss" scoped>
.mydrawer {
:deep(.card) {
padding: 0;
border: none;
}
}
.mypicture {
:deep(.el-upload--picture-card) {
width: 70px;
height: 70px;
}
:deep(.el-upload-list__item) {
width: 70px;
height: 70px;
}
:deep(.el-upload--picture-card) {
font-size: 12px;
}
}
.after-border {
position: relative;
::after {
position: absolute;
top: -20px;
right: 0;
bottom: 0;
width: 1px;
background: #e5e7eb;
content: '';
display: block;
}
}
.overflow-hidden1 {
.el-form-item {
margin-bottom: 5px !important;
}
}
</style>
<style lang="scss">
.el-drawer .el-drawer__header .el-tag--warning .el-tag__content {
color: var(--el-color-warning) !important;
}
.el-drawer .el-drawer__header .el-tag--success .el-tag__content {
color: var(--el-color-success) !important;
}
.el-drawer .el-drawer__header .el-tag--danger .el-tag__content {
color: var(--el-color-danger) !important;
}
.overflow-hidden1 {
.el-drawer__body{
overflow: hidden;
}
}
</style>
...@@ -17,96 +17,7 @@ ...@@ -17,96 +17,7 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<ProTable :config="config" ref="ProTableRef" :api="getReducePage" :selectdList="selectdList" :paramCallback="paramCallback"> <ProTable :config="config" ref="ProTableRef" :api="getReducePage" :paramCallback="paramCallback">
<template #left_buttons>
<!-- <el-button type="primary">下载申请 </el-button> -->
<el-button
type="primary"
@click="changeStatus"
:disabled="!selectdList || !selectdList.length"
>审批
</el-button>
<!-- <el-button type="primary">下载 </el-button>
<el-button type="primary">批量修复上传 </el-button> -->
</template>
<template #expand_content="{ row }">
<div class="expand-box">
<div>案件明细</div>
<div class="expand-table">
<div v-for="(item, index) in row.reduceRecords" :key="index">
<div class="public-header">
{{ item?.loan?.caseId }}
</div>
<table
><tbody>
<tr>
<td class="label">案件ID</td>
<td>{{ item?.loan?.caseId }}</td>
<td class="label">借款平台</td>
<td>{{ item?.loan?.loanPlatform?.name }}</td>
<td class="label">资管公司</td>
<td>{{ item?.loan?.manageOrg.orgName }}</td>
</tr>
<tr>
<td class="label">身份证</td>
<td>{{ item?.loan?.borrower?.idCard }}</td>
<td class="label">手机号</td>
<td>{{ item?.loan?.borrower?.phone }}</td>
<td class="label">折扣</td>
<td>{{ item?.loan?.discount }}</td>
<td class="label">委案金额</td>
<td>{{ item?.loan?.commissionAmount }}</td>
</tr>
<tr>
<td class="label">累计还款金额</td>
<td>{{ item?.loan?.sumRepayAmount }}</td>
<td class="label">累计减免金额</td>
<td>{{ item?.loan?.sumReductionAmount }}</td>
<td class="label">减免金额</td>
<td>{{ item?.reduceAmount }}</td>
<td class="label">剩余待还金额</td>
<td>{{ item?.loan?.remainingAmount }}</td>
</tr>
<tr>
<td class="label">CPE</td>
<td>{{ item?.loan?.cpe?.username }}</td>
<td class="label">分派CPE日期</td>
<td>{{ item?.loan?.cpeDate }}</td>
<td class="label">本金余额</td>
<td>{{ item?.loan?.principalBalance }}</td>
<td class="label">案件状态</td>
<td>
{{
item?.loan?.caseStatus
? CaseStatus?.find((v) => v.value === item?.loan?.caseStatus)?.label
: ''
}}</td
>
</tr>
<tr>
<td class="label">手续费</td>
<td>{{ item?.loan?.commission }}</td>
<td class="label">跟进结果</td>
<td>{{
item?.loan?.followStatus
? FollowStatus?.find((v) => v.value === item?.loan?.followStatus)?.label
: ''
}}</td>
<td class="label">跟进状态</td>
<td>{{
item?.loan?.phoneResultStatus
? PhoneResultStatus?.find(
(v) => v.value === item?.loan?.phoneResultStatus
)?.label
: ''
}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</template>
</ProTable> </ProTable>
<vxe-modal <vxe-modal
resize resize
...@@ -126,12 +37,17 @@ ...@@ -126,12 +37,17 @@
<el-button type="primary" @click="submitForm('pass')">通过</el-button> <el-button type="primary" @click="submitForm('pass')">通过</el-button>
</template> </template>
</vxe-modal> </vxe-modal>
<reduceDrawer
ref="reduceDrawerRef"
@success="query"
></reduceDrawer>
<el-image-viewer :url-list="srcList" v-if="RefImage" @close="RefImage = false" /> <el-image-viewer :url-list="srcList" v-if="RefImage" @close="RefImage = false" />
</div> </div>
</template> </template>
<script setup name="systemLog" lang="jsx"> <script setup name="systemLog" lang="jsx">
import { computed } from 'vue'; import { computed } from 'vue';
import reduceDrawer from './components/reduceDrawer.vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getReducePage,getReduceTotal, flowStatusByIds } from '@/api/property'; import { getReducePage,getReduceTotal, flowStatusByIds } from '@/api/property';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
...@@ -142,6 +58,7 @@ ...@@ -142,6 +58,7 @@
import { Download } from '@element-plus/icons-vue'; import { Download } from '@element-plus/icons-vue';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
const envs = getAppEnvConfig(); const envs = getAppEnvConfig();
const reduceDrawerRef = ref();
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus", "CaseStatus"); const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus", "CaseStatus");
const downloadfile = inject('download'); const downloadfile = inject('download');
...@@ -159,6 +76,11 @@ ...@@ -159,6 +76,11 @@
const name = item.slice(item.lastIndexOf('/') + 1, item.length); const name = item.slice(item.lastIndexOf('/') + 1, item.length);
downloadfile('/sys/static/' + item, {}, name); downloadfile('/sys/static/' + item, {}, name);
}; };
const changeStatus = async (row) => {
reduceDrawerRef.value.openModal(
JSON.parse(JSON.stringify(row))
);
};
const paramCallback = (param) => { const paramCallback = (param) => {
const obj = JSON.parse(JSON.stringify(param)); const obj = JSON.parse(JSON.stringify(param));
obj['flowStatus'] = activeName.value; obj['flowStatus'] = activeName.value;
...@@ -201,9 +123,6 @@ ...@@ -201,9 +123,6 @@
selectdList.value = []; selectdList.value = [];
} }
}; };
const changeStatus = async () => {
showModal.value = true;
};
const handleClick = () => { const handleClick = () => {
setTimeout(() => { setTimeout(() => {
query(); query();
...@@ -235,8 +154,8 @@ ...@@ -235,8 +154,8 @@
const config = computed(() => { const config = computed(() => {
return { return {
columns: [ columns: [
{ type: 'checkbox', width: 60, fixed: 'left' }, // { type: 'checkbox', width: 60, fixed: 'left' },
{ type: 'expand', width: 40, slots: { content: 'expand_content' } }, // { type: 'expand', width: 40, slots: { content: 'expand_content' } },
{ {
field: 'caseId', field: 'caseId',
title: '案件ID', title: '案件ID',
...@@ -287,9 +206,9 @@ ...@@ -287,9 +206,9 @@
width: 120, width: 120,
}, },
{ {
title: 'CPE', title: '发起人',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 60, width: 70,
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
if (row.cpe?.username) { if (row.cpe?.username) {
...@@ -372,6 +291,7 @@ ...@@ -372,6 +291,7 @@
field: 'applyDate', field: 'applyDate',
title: '减免截止时间', title: '减免截止时间',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 120,
search: { search: {
el: 'date-picker', el: 'date-picker',
labelWidth: 90, labelWidth: 90,
...@@ -381,6 +301,7 @@ ...@@ -381,6 +301,7 @@
{ {
field: 'inEffectDate', field: 'inEffectDate',
title: '减免生效时间', title: '减免生效时间',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
search: { search: {
el: 'date-picker', el: 'date-picker',
...@@ -388,6 +309,22 @@ ...@@ -388,6 +309,22 @@
props: { type: 'datetime', valueFormat: 'YYYY-MM-DD HH:mm:ss' }, props: { type: 'datetime', valueFormat: 'YYYY-MM-DD HH:mm:ss' },
}, },
}, },
{
field: 'code',
title: '操作',
width: 120,
slots: {
default: ({ row, rowIndex }) => {
return (
<>
<ElButton type="primary" onClick={() => changeStatus(row)}>
{row.flowStatus === 'pending' ? '查看并审核' : '查看'}
</ElButton>
</>
);
},
},
}
], ],
onCheckboxChange: onCheckboxChange, onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll, onCheckboxAll: onCheckboxAll,
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
esc-closable esc-closable
> >
<div class="w-full px-3 h-full overflow-auto flex-col flex mytable"> <div class="w-full px-3 h-full overflow-auto flex-col flex mytable">
是否审批通过选中的数据? 是否审批通过{{currentRow ? `借款人${currentRow?.borrower?.name}, 还款金额${currentRow?.realRepayAmount}`: '选中'}}的数据?
</div> </div>
<template #footer> <template #footer>
<el-button type="default" @click="showModal = false">取消</el-button> <el-button type="default" @click="showModal = false">取消</el-button>
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,7 @@
const { RepayType, FlowStatus } = useDict("RepayType", "FlowStatus"); const { RepayType, FlowStatus } = useDict("RepayType", "FlowStatus");
const ProTableRef = ref(); const ProTableRef = ref();
const showModal = ref(false); const showModal = ref(false);
const currentRow = ref(null);
const activeName = ref('pending'); const activeName = ref('pending');
const tabs = ref([]); const tabs = ref([]);
const selectdList = ref([]); const selectdList = ref([]);
...@@ -116,7 +117,12 @@ ...@@ -116,7 +117,12 @@
}, 500) }, 500)
return obj; return obj;
}; };
const changeStatus = async () => { const changeStatus = async (row) => {
if (row.id) {
currentRow.value = row
} else {
currentRow.value = null
}
showModal.value = true; showModal.value = true;
}; };
const submitForm = async (type) => { const submitForm = async (type) => {
...@@ -160,7 +166,7 @@ ...@@ -160,7 +166,7 @@
} }
}, },
}, },
width: 80, width: 180,
}, },
{ {
field: 'borrower.name', field: 'borrower.name',
...@@ -172,7 +178,7 @@ ...@@ -172,7 +178,7 @@
{ {
title: 'CPE', title: 'CPE',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 60, width: 80,
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
if (row.reduce && row.reduce.reduceRecords) { if (row.reduce && row.reduce.reduceRecords) {
...@@ -220,6 +226,7 @@ ...@@ -220,6 +226,7 @@
{ {
field: 'realRepayAmount', field: 'realRepayAmount',
title: '实际还款金额', title: '实际还款金额',
width: 140,
showOverflow: 'tooltip', showOverflow: 'tooltip',
search: { el: 'input', labelWidth: 90 }, search: { el: 'input', labelWidth: 90 },
}, },
...@@ -232,7 +239,7 @@ ...@@ -232,7 +239,7 @@
labelWidth: 90, labelWidth: 90,
props: { type: 'datetime', valueFormat: 'YYYY-MM-DD HH:mm:ss' }, props: { type: 'datetime', valueFormat: 'YYYY-MM-DD HH:mm:ss' },
}, },
width: 115, width: 140,
}, },
{ {
field: 'reduce.totalPayAmount', field: 'reduce.totalPayAmount',
...@@ -255,7 +262,7 @@ ...@@ -255,7 +262,7 @@
); );
}, },
}, },
width: 80, width: 100,
}, },
{ {
field: 'loanPlatform', field: 'loanPlatform',
...@@ -284,6 +291,23 @@ ...@@ -284,6 +291,23 @@
}, },
}, },
}, },
{
field: 'code',
title: '操作',
width: 120,
visible: activeName.value === 'pending' ? true : false,
slots: {
default: ({ row, rowIndex }) => {
return (
<>
<ElButton type="primary" onClick={() => changeStatus(row)}>
审批
</ElButton>
</>
);
},
},
}
], ],
onCheckboxChange: onCheckboxChange, onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll, onCheckboxAll: onCheckboxAll,
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
<template #left_buttons> <template #left_buttons>
<el-button <el-button
type="primary" type="primary"
v-if="activeName === 'un_audit'"
@click="audit" @click="audit"
v-permission="'send_audio'" v-permission="'send_audio'"
:disabled="!selectdList || selectdList.length === 0" :disabled="!selectdList || selectdList.length === 0"
......
...@@ -238,7 +238,7 @@ ...@@ -238,7 +238,7 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { computed } from 'vue'; import { computed } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { ElInputNumber, ElMessage } from 'element-plus'; import { ElInputNumber, ElMessage, ElTag } from 'element-plus';
import { Upload } from '@element-plus/icons-vue'; import { Upload } from '@element-plus/icons-vue';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { saveTrackRecord } from '@/api/property'; import { saveTrackRecord } from '@/api/property';
...@@ -397,9 +397,9 @@ ...@@ -397,9 +397,9 @@
const config = reactive({ const config = reactive({
minHeight: 200, minHeight: 200,
checkboxConfig: { checkboxConfig: {
checkMethod: ({ row }) => { // checkMethod: ({ row }) => {
return props.mergerCase !== 'Y'; // return props.mergerCase !== 'Y';
}, // },
}, },
columns: [ columns: [
{ type: 'checkbox', width: 60, fixed: 'left' }, { type: 'checkbox', width: 60, fixed: 'left' },
...@@ -408,6 +408,17 @@ ...@@ -408,6 +408,17 @@
title: '案件ID', title: '案件ID',
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
{
field: 'mergerCase',
title: '是否共案处理',
showOverflow: 'tooltip',
width: 100,
slots: {
default: ({ row }) => {
return <ElTag>{row.mergerCase == 'Y' ? '是' : '否'}</ElTag>;
},
},
},
{ {
field: 'product', field: 'product',
title: '产品', title: '产品',
......
...@@ -125,7 +125,7 @@ ...@@ -125,7 +125,7 @@
import { computed } from 'vue'; import { computed } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { saveReduce } from '@/api/property'; import { saveReduce } from '@/api/property';
import { ElMessage } from 'element-plus'; import { ElMessage, ElTag } from 'element-plus';
import { Download, ZoomIn } from '@element-plus/icons-vue'; import { Download, ZoomIn } from '@element-plus/icons-vue';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { watch } from 'vue'; import { watch } from 'vue';
...@@ -233,9 +233,9 @@ ...@@ -233,9 +233,9 @@
}; };
const config = reactive({ const config = reactive({
checkboxConfig: { checkboxConfig: {
checkMethod: ({ row }) => { // checkMethod: ({ row }) => {
return props.mergerCase !== 'Y'; // return props.mergerCase !== 'Y';
}, // },
}, },
minHeight: 200, minHeight: 200,
columns: [ columns: [
...@@ -246,6 +246,17 @@ ...@@ -246,6 +246,17 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
title: '案件ID', title: '案件ID',
}, },
{
field: 'mergerCase',
title: '是否共案处理',
showOverflow: 'tooltip',
width: 100,
slots: {
default: ({ row }) => {
return <ElTag>{row.loan.mergerCase == 'Y' ? '是' : '否'}</ElTag>;
},
},
},
{ {
field: 'loan.product', field: 'loan.product',
width: 100, width: 100,
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
<td class="label">减免生效时间</td> <td class="label">减免生效时间</td>
<td>{{ currentInfo.inEffectDate }}</td> <td>{{ currentInfo.inEffectDate }}</td>
<td class="label">应还金额</td> <td class="label">应还金额</td>
<td colspan="5">{{ currentInfo.totalPayAmount }}</td> <td colspan="5">{{ Decimal(currentInfo.remainingAmount).sub(currentInfo.totalReduceAmount) }}</td>
</tr> </tr>
<!-- Add more rows as needed --> <!-- Add more rows as needed -->
</table> </table>
...@@ -188,9 +188,10 @@ ...@@ -188,9 +188,10 @@
<script setup lang="jsx" name="allocationModal"> <script setup lang="jsx" name="allocationModal">
import { computed } from 'vue'; import { computed } from 'vue';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import Decimal from 'decimal.js';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { ElMessage } from 'element-plus'; import { ElMessage,ElTag } from 'element-plus';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
const { PhoneResultStatus, RepayType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","RepayType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus"); const { PhoneResultStatus, RepayType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","RepayType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus");
import { saveRepayRecord } from '@/api/property'; import { saveRepayRecord } from '@/api/property';
...@@ -216,7 +217,7 @@ ...@@ -216,7 +217,7 @@
const radio = ref(0); const radio = ref(0);
const validaterealRepayAmount = (rule, value, callback) => { const validaterealRepayAmount = (rule, value, callback) => {
if ( if (
Number(value) !== Number(currentInfo.value.totalPayAmount) && Number(value) !== Number(Decimal(currentInfo.value.remainingAmount).sub(currentInfo.value.totalReduceAmount)) &&
currentType.value === '结清减免还款' currentType.value === '结清减免还款'
) { ) {
callback(new Error('*金额必须等于应还金额')); callback(new Error('*金额必须等于应还金额'));
......
...@@ -178,7 +178,7 @@ ...@@ -178,7 +178,7 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { computed } from 'vue'; import { computed } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { ElInputNumber, ElMessage } from 'element-plus'; import { ElInputNumber, ElMessage, ElTag } from 'element-plus';
import { savebyStages } from '@/api/property'; import { savebyStages } from '@/api/property';
import { getByIdPlatforms } from '@/api/platform'; import { getByIdPlatforms } from '@/api/platform';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
...@@ -373,9 +373,9 @@ ...@@ -373,9 +373,9 @@
}; };
const config = reactive({ const config = reactive({
checkboxConfig: { checkboxConfig: {
checkMethod: ({ row }) => { // checkMethod: ({ row }) => {
return props.mergerCase !== 'Y'; // return props.mergerCase !== 'Y';
}, // },
}, },
minHeight: 200, minHeight: 200,
columns: [ columns: [
...@@ -385,6 +385,17 @@ ...@@ -385,6 +385,17 @@
title: '案件ID', title: '案件ID',
showOverflow: 'tooltip', showOverflow: 'tooltip',
}, },
{
field: 'mergerCase',
title: '是否共案处理',
showOverflow: 'tooltip',
width: 100,
slots: {
default: ({ row }) => {
return <ElTag>{row.mergerCase == 'Y' ? '是' : '否'}</ElTag>;
},
},
},
{ {
field: 'product', field: 'product',
title: '产品', title: '产品',
......
...@@ -378,7 +378,7 @@ ...@@ -378,7 +378,7 @@
}, },
}, },
enum: () => getTenantPage({ current: 1, size: 999999999, status: 'enable' }), enum: () => getTenantPage({ current: 1, size: 999999999, status: 'enable' }),
search: authButtonListGet.includes('allcation_for_tenant') ? { el: 'select', props: { filterable: true }, key: 'tenant', labelWidth: 105 } : null, search: authButtonListGet.includes('allcation_for_tenant') ? { el: 'select', props: { filterable: true }, key: 'tenant', labelWidth: 90 } : null,
fieldNames: { label: 'name', value: 'id' }, fieldNames: { label: 'name', value: 'id' },
title: '调解中心', title: '调解中心',
width: 100, width: 100,
......
...@@ -211,18 +211,21 @@ ...@@ -211,18 +211,21 @@
{ {
field: 'code', field: 'code',
title: '导入批次', title: '导入批次',
width: 100,
showOverflow: 'tooltip', showOverflow: 'tooltip',
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true } },
}, },
{ {
field: 'maxStagesNum', field: 'maxStagesNum',
title: '分期最大期数', title: '分期最大期数',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true } },
}, },
{ {
field: 'minAmount', field: 'minAmount',
title: '最低分期金额', title: '最低分期金额',
width: 120,
showOverflow: 'tooltip', showOverflow: 'tooltip',
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true } },
}, },
...@@ -230,7 +233,7 @@ ...@@ -230,7 +233,7 @@
field: 'mergerCase', field: 'mergerCase',
title: '是否共案处理', title: '是否共案处理',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 100, width: 110,
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return <ElTag>{row.mergerCase == 'Y' ? '是' : '否'}</ElTag>; return <ElTag>{row.mergerCase == 'Y' ? '是' : '否'}</ElTag>;
...@@ -241,6 +244,7 @@ ...@@ -241,6 +244,7 @@
field: 'code', field: 'code',
title: '资产类型', title: '资产类型',
enum: options, enum: options,
width: 100,
showOverflow: 'tooltip', showOverflow: 'tooltip',
search: { el: 'select', props: { filterable: true } }, search: { el: 'select', props: { filterable: true } },
fieldNames: { label: 'genderLabel', value: 'genderValue' }, fieldNames: { label: 'genderLabel', value: 'genderValue' },
...@@ -248,16 +252,19 @@ ...@@ -248,16 +252,19 @@
{ {
field: 'totalCaseNum', field: 'totalCaseNum',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 100,
title: '案件总数', title: '案件总数',
}, },
{ {
field: 'totalAmount', field: 'totalAmount',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 120,
title: '案件总金额', title: '案件总金额',
}, },
{ {
field: 'totalBorrowerNum', field: 'totalBorrowerNum',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 100,
title: '客户总数', title: '客户总数',
}, },
{ {
...@@ -287,7 +294,7 @@ ...@@ -287,7 +294,7 @@
field: 'action', field: 'action',
title: '文件地址', title: '文件地址',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 200, width: 80,
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
...@@ -317,7 +324,7 @@ ...@@ -317,7 +324,7 @@
code: '', code: '',
maxStagesNum: '', maxStagesNum: '',
minAmount: '', minAmount: '',
mergerCase: 'N', mergerCase: 'Y',
discount: '', discount: '',
}); });
const upload = reactive({ const upload = reactive({
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
<template #left_buttons> <template #left_buttons>
<el-button <el-button
type="primary" type="primary"
v-if="activeName === 'un_audit'"
@click="audit" @click="audit"
v-permission="'send_audio'" v-permission="'send_audio'"
:disabled="!selectdList || selectdList.length === 0" :disabled="!selectdList || selectdList.length === 0"
......
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