Commit 4b2f2732 authored by 沈翠玲's avatar 沈翠玲

增加统计

parent 653ee653
...@@ -51,3 +51,15 @@ export const stayLoan = (params) => { ...@@ -51,3 +51,15 @@ export const stayLoan = (params) => {
export const getTenantUsers = (params) => { export const getTenantUsers = (params) => {
return request.get('/tenant/getTenantUsers', params); return request.get('/tenant/getTenantUsers', params);
}; };
// 获取回收的资产统计
export const getLoanBack = (params) => {
return request.get('/LoanBack/totalLoan', params);
};
// 案件管理统计
export const getLoanBacktotal = (params) => {
return request.get('/LoanBack/total', params);
};
// 资产列表
export const getLoanBackpage = (params) => {
return request.get('/LoanBack/page', params);
};
\ No newline at end of file
...@@ -45,6 +45,9 @@ export const saveRepayRecord = (data) => { ...@@ -45,6 +45,9 @@ export const saveRepayRecord = (data) => {
export const getRepayRecordPage = (params) => { export const getRepayRecordPage = (params) => {
return request.get('/repayRecord/page', params); return request.get('/repayRecord/page', params);
}; };
export const getRepayRecordTotal = (params) => {
return request.get('/repayRecord/flowStatusTotal', params);
};
// 还款申请批量 // 还款申请批量
export const repayRecordFlowStatusByIds = (params) => { export const repayRecordFlowStatusByIds = (params) => {
return request.get('/repayRecord/flowStatusByIds', params); return request.get('/repayRecord/flowStatusByIds', params);
...@@ -58,6 +61,9 @@ export const saveReduce = (data) => { ...@@ -58,6 +61,9 @@ export const saveReduce = (data) => {
export const getReducePage = (params) => { export const getReducePage = (params) => {
return request.get('/reduce/page', params); return request.get('/reduce/page', params);
}; };
export const getReduceTotal = (params) => {
return request.get('/reduce/flowStatusTotal', params);
};
// 减免申请批量 // 减免申请批量
export const flowStatusByIds = (params) => { export const flowStatusByIds = (params) => {
return request.get('/reduce/flowStatusByIds', params); return request.get('/reduce/flowStatusByIds', params);
...@@ -75,6 +81,10 @@ export const changeAmount = (data) => { ...@@ -75,6 +81,10 @@ export const changeAmount = (data) => {
export const getByStagesPage = (params) => { export const getByStagesPage = (params) => {
return request.get('/byStages/page', params); return request.get('/byStages/page', params);
}; };
// 分期申请列表
export const getByStagesTotal = (params) => {
return request.get('/byStages/flowStatusTotal', params);
};
// 分期申请批量审核 // 分期申请批量审核
export const byStagesflowStatusByIds = (params) => { export const byStagesflowStatusByIds = (params) => {
return request.get('/byStages/flowStatusByIds', params); return request.get('/byStages/flowStatusByIds', params);
...@@ -88,7 +98,14 @@ export const saveTrackRecord = (data) => { ...@@ -88,7 +98,14 @@ export const saveTrackRecord = (data) => {
export const getTrackRecord = (params) => { export const getTrackRecord = (params) => {
return request.get('/TrackRecord/page', params); return request.get('/TrackRecord/page', params);
}; };
// 案件跟踪记录列表
export const getTrackRecordTotal = (params) => {
return request.get('/TrackRecord/flowStatusTotal', params);
};
// 案件跟踪记录统计
export const getTrackRecordAuditTotal = (params) => {
return request.get('/TrackRecord/auditStatusTotal', params);
};
// 联络人修复申请 // 联络人修复申请
export const saveRepairRecord = (data) => { export const saveRepairRecord = (data) => {
return request.post('/RepairRecord/save', data); return request.post('/RepairRecord/save', data);
...@@ -97,6 +114,9 @@ export const saveRepairRecord = (data) => { ...@@ -97,6 +114,9 @@ export const saveRepairRecord = (data) => {
export const getRepairRecord = (params) => { export const getRepairRecord = (params) => {
return request.get('/RepairRecord/page', params); return request.get('/RepairRecord/page', params);
}; };
export const getRepairRecordTotal = (params) => {
return request.get('/RepairRecord/flowStatusTotal', params);
};
export const importExcel = (params) => { export const importExcel = (params) => {
return request.get('/RepairRecord/importExcel', params); return request.get('/RepairRecord/importExcel', params);
}; };
......
...@@ -26,7 +26,7 @@ body, ...@@ -26,7 +26,7 @@ body,
line-height: 28px !important; line-height: 28px !important;
} }
.el-form-item { .el-form-item {
margin-bottom: 10px !important; margin-bottom: 15px !important;
} }
.el-tabs__item { .el-tabs__item {
font-size: 13px !important; font-size: 13px !important;
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<script setup name="systemLog" lang="jsx"> <script setup name="systemLog" lang="jsx">
import { computed } from 'vue'; import { computed } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getTrackRecord } from '@/api/property'; import { getTrackRecord, getTrackRecordTotal } from '@/api/property';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { ElMessageBox, ElMessage, ElButton, ElTag } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton, ElTag } from 'element-plus';
......
<template> <template>
<div class="table-box"> <div class="table-box">
<ProTable :config="config" ref="ProTableRef" :api="getByStagesPage" :selectdList="selectdList"> <div class=" bg-white pt-2 pl-2">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane
:label="item.label"
:name="item.value"
v-for="(item, index) in tabs"
:key="index"
>
<template #label>
<div>
{{item.label}}
<span style="font-size: 20px; font-weight: bold;">{{item.msg}}</span>
</div>
</template>
</el-tab-pane>
</el-tabs>
</div>
<ProTable :config="config" ref="ProTableRef" :api="getByStagesPage" :selectdList="selectdList" :paramCallback="paramCallback">
<template #left_buttons> <template #left_buttons>
<!-- <el-button type="primary">下载申请 </el-button> --> <!-- <el-button type="primary">下载申请 </el-button> -->
<el-button <el-button
...@@ -142,7 +159,7 @@ ...@@ -142,7 +159,7 @@
import { computed } from 'vue'; import { computed } from 'vue';
import { inject } from 'vue'; import { inject } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getByStagesPage, byStagesflowStatusByIds } from '@/api/property'; import { getByStagesPage,getByStagesTotal, byStagesflowStatusByIds } from '@/api/property';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { ElMessageBox, ElMessage, ElButton } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { Download } from '@element-plus/icons-vue'; import { Download } from '@element-plus/icons-vue';
...@@ -154,6 +171,8 @@ ...@@ -154,6 +171,8 @@
const RefImage = ref(false); const RefImage = ref(false);
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');
const activeName = ref('pending');
const tabs = ref([]);
const ProTableRef = ref(); const ProTableRef = ref();
const showModal = ref(false); const showModal = ref(false);
...@@ -162,6 +181,46 @@ ...@@ -162,6 +181,46 @@
console.log('row', row); console.log('row', row);
selectdList.value = row.records; selectdList.value = row.records;
}; };
const paramCallback = (param) => {
const obj = JSON.parse(JSON.stringify(param));
obj['flowStatus'] = activeName.value;
if (obj['trackTime']) {
if (obj['trackTime'][0]) obj['trackTimeBegin'] = obj['trackTime'][0];
if (obj['trackTime'][1]) obj['trackTimeEnd'] = obj['trackTime'][1];
delete obj['trackTime'];
}
if (obj['nextTime']) {
if (obj['nextTime'][0]) obj['nextTrackTimeBegin'] = obj['nextTime'][0];
if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1];
delete obj['nextTime'];
}
setTimeout(() => {
const arr = JSON.parse(JSON.stringify(FlowStatus.value))
getByStagesTotal({...obj, flowStatus: null}).then(res => {
if (res.success) {
arr.forEach(item => {
const tt = res.result.find(v => v.flowStatus === item.value)
if (tt) {
item['msg'] = tt.number
} else {
item['msg'] = 0
}
})
tabs.value = arr
} else {
tabs.value = arr
}
}).catch(e => {
tabs.value = arr
})
}, 500)
return obj;
};
const handleClick = () => {
setTimeout(() => {
query();
}, 300);
};
const download = (item) => { const download = (item) => {
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);
...@@ -396,7 +455,7 @@ ...@@ -396,7 +455,7 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
enum: FlowStatus, enum: FlowStatus,
search: { el: 'select', props: { filterable: true }, span: 1, labelWidth: 90 }, // search: { el: 'select', props: { filterable: true }, span: 1, labelWidth: 90 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
......
<template> <template>
<div class="table-box"> <div class="table-box">
<ProTable :config="config" ref="ProTableRef" :api="getReducePage" :selectdList="selectdList"> <div class=" bg-white pt-2 pl-2">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane
:label="item.label"
:name="item.value"
v-for="(item, index) in tabs"
:key="index"
>
<template #label>
<div>
{{item.label}}
<span style="font-size: 20px; font-weight: bold;">{{item.msg}}</span>
</div>
</template>
</el-tab-pane>
</el-tabs>
</div>
<ProTable :config="config" ref="ProTableRef" :api="getReducePage" :selectdList="selectdList" :paramCallback="paramCallback">
<template #left_buttons> <template #left_buttons>
<!-- <el-button type="primary">下载申请 </el-button> --> <!-- <el-button type="primary">下载申请 </el-button> -->
<el-button <el-button
...@@ -116,7 +133,7 @@ ...@@ -116,7 +133,7 @@
<script setup name="systemLog" lang="jsx"> <script setup name="systemLog" lang="jsx">
import { computed } from 'vue'; import { computed } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getReducePage, flowStatusByIds } from '@/api/property'; import { getReducePage,getReduceTotal, flowStatusByIds } from '@/api/property';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { inject } from 'vue'; import { inject } from 'vue';
import { ElMessageBox, ElMessage, ElButton } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
...@@ -130,17 +147,53 @@ ...@@ -130,17 +147,53 @@
const downloadfile = inject('download'); const downloadfile = inject('download');
const ProTableRef = ref(); const ProTableRef = ref();
const showModal = ref(false); const showModal = ref(false);
const tabs = ref([]);
const srcList = ref([]); const srcList = ref([]);
const activeName = ref('pending');
const RefImage = ref(false); const RefImage = ref(false);
const selectdList = ref([]); const selectdList = ref([]);
const onCheckboxChange = (row) => { const onCheckboxChange = (row) => {
console.log('row', row);
selectdList.value = row.records; selectdList.value = row.records;
}; };
const download = (item) => { const download = (item) => {
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 paramCallback = (param) => {
const obj = JSON.parse(JSON.stringify(param));
obj['flowStatus'] = activeName.value;
if (obj['trackTime']) {
if (obj['trackTime'][0]) obj['trackTimeBegin'] = obj['trackTime'][0];
if (obj['trackTime'][1]) obj['trackTimeEnd'] = obj['trackTime'][1];
delete obj['trackTime'];
}
if (obj['nextTime']) {
if (obj['nextTime'][0]) obj['nextTrackTimeBegin'] = obj['nextTime'][0];
if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1];
delete obj['nextTime'];
}
setTimeout(() => {
const arr = JSON.parse(JSON.stringify(FlowStatus.value))
getReduceTotal({...obj, flowStatus: null}).then(res => {
if (res.success) {
arr.forEach(item => {
const tt = res.result.find(v => v.flowStatus === item.value)
if (tt) {
item['msg'] = tt.number
} else {
item['msg'] = 0
}
})
tabs.value = arr
} else {
tabs.value = arr
}
}).catch(e => {
tabs.value = arr
})
}, 500)
return obj;
};
const onCheckboxAll = (flag) => { const onCheckboxAll = (flag) => {
if (flag.checked) { if (flag.checked) {
selectdList.value = flag.records; selectdList.value = flag.records;
...@@ -151,6 +204,11 @@ ...@@ -151,6 +204,11 @@
const changeStatus = async () => { const changeStatus = async () => {
showModal.value = true; showModal.value = true;
}; };
const handleClick = () => {
setTimeout(() => {
query();
}, 300);
};
const preview = (item, type) => { const preview = (item, type) => {
const list = []; const list = [];
item[type].forEach((v) => { item[type].forEach((v) => {
...@@ -296,7 +354,7 @@ ...@@ -296,7 +354,7 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
enum: FlowStatus, enum: FlowStatus,
search: { el: 'select', props: { filterable: true }, span: 1, labelWidth: 90 }, // search: { el: 'select', props: { filterable: true }, span: 1, labelWidth: 90 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
......
<template> <template>
<div class="table-box"> <div class="table-box">
<ProTable :config="config" ref="caseLRef" :api="getRepairRecord" :selectdList="selectdList"> <div class=" bg-white pt-2 pl-2">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane
:label="item.label"
:name="item.value"
v-for="(item, index) in tabs"
:key="index"
>
<template #label>
<div>
{{item.label}}
<span style="font-size: 20px; font-weight: bold;">{{item.msg}}</span>
</div>
</template>
</el-tab-pane>
</el-tabs>
</div>
<ProTable :config="config" ref="caseLRef" :api="getRepairRecord" :paramCallback="paramCallback" :selectdList="selectdList">
<template #left_buttons> <template #left_buttons>
<!-- <el-button type="primary">下载申请 </el-button> --> <!-- <el-button type="primary">下载申请 </el-button> -->
<el-button <el-button
...@@ -38,7 +55,7 @@ ...@@ -38,7 +55,7 @@
import { computed } from 'vue'; import { computed } from 'vue';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getRepairRecord, RepairRecordStatusByIds } from '@/api/property'; import { getRepairRecord,getRepairRecordTotal, RepairRecordStatusByIds } from '@/api/property';
import { ElMessageBox, ElMessage, ElButton } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { getTenantPage } from '@/api/tenant'; import { getTenantPage } from '@/api/tenant';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
...@@ -46,6 +63,8 @@ ...@@ -46,6 +63,8 @@
const tabledata = ref([]); const tabledata = ref([]);
const showModal = ref(false); const showModal = ref(false);
const tabs = ref([]);
const activeName = ref('pending');
const caseLRef = ref(); const caseLRef = ref();
const selectdList = ref([]); const selectdList = ref([]);
const onCheckboxChange = (row) => { const onCheckboxChange = (row) => {
...@@ -59,6 +78,46 @@ ...@@ -59,6 +78,46 @@
selectdList.value = []; selectdList.value = [];
} }
}; };
const handleClick = () => {
setTimeout(() => {
query();
}, 300);
};
const paramCallback = (param) => {
const obj = JSON.parse(JSON.stringify(param));
obj['flowStatus'] = activeName.value;
if (obj['trackTime']) {
if (obj['trackTime'][0]) obj['trackTimeBegin'] = obj['trackTime'][0];
if (obj['trackTime'][1]) obj['trackTimeEnd'] = obj['trackTime'][1];
delete obj['trackTime'];
}
if (obj['nextTime']) {
if (obj['nextTime'][0]) obj['nextTrackTimeBegin'] = obj['nextTime'][0];
if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1];
delete obj['nextTime'];
}
setTimeout(() => {
const arr = JSON.parse(JSON.stringify(FlowStatus.value))
getRepairRecordTotal({...obj, flowStatus: null}).then(res => {
if (res.success) {
arr.forEach(item => {
const tt = res.result.find(v => v.flowStatus === item.value)
if (tt) {
item['msg'] = tt.number
} else {
item['msg'] = 0
}
})
tabs.value = arr
} else {
tabs.value = arr
}
}).catch(e => {
tabs.value = arr
})
}, 500)
return obj;
};
const changeStatus = async () => { const changeStatus = async () => {
showModal.value = true; showModal.value = true;
}; };
...@@ -201,7 +260,7 @@ ...@@ -201,7 +260,7 @@
title: '审核状态', title: '审核状态',
width: 95, width: 95,
enum: FlowStatus, enum: FlowStatus,
search: { el: 'select', props: { filterable: true }, labelWidth: 105 }, // search: { el: 'select', props: { filterable: true }, labelWidth: 105 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
......
<template> <template>
<div class="table-box"> <div class="table-box">
<ProTable :config="config" ref="ProTableRef" :api="getRepayRecordPage" :selectdList="selectdList"> <div class=" bg-white pt-2 pl-2">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane
:label="item.label"
:name="item.value"
v-for="(item, index) in tabs"
:key="index"
>
<template #label>
<div>
{{item.label}}
<span style="font-size: 20px; font-weight: bold;">{{item.msg}}</span>
</div>
</template>
</el-tab-pane>
</el-tabs>
</div>
<ProTable :config="config" ref="ProTableRef" :api="getRepayRecordPage" :paramCallback="paramCallback" :selectdList="selectdList">
<template #left_buttons> <template #left_buttons>
<!-- <el-button type="primary">下载申请 </el-button> --> <!-- <el-button type="primary">下载申请 </el-button> -->
<el-button <el-button
...@@ -37,7 +54,7 @@ ...@@ -37,7 +54,7 @@
<script setup name="repaymentApprove" lang="jsx"> <script setup name="repaymentApprove" lang="jsx">
import { computed } from 'vue'; import { computed } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getRepayRecordPage, repayRecordFlowStatusByIds } from '@/api/property'; import { getRepayRecordPage, getRepayRecordTotal, repayRecordFlowStatusByIds } from '@/api/property';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { ElMessageBox, ElMessage, ElButton } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
...@@ -45,6 +62,8 @@ ...@@ -45,6 +62,8 @@
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 activeName = ref('pending');
const tabs = ref([]);
const selectdList = ref([]); const selectdList = ref([]);
const onCheckboxChange = (row) => { const onCheckboxChange = (row) => {
console.log('row', row); console.log('row', row);
...@@ -57,7 +76,41 @@ ...@@ -57,7 +76,41 @@
selectdList.value = []; selectdList.value = [];
} }
}; };
const paramCallback = (param) => {
const obj = JSON.parse(JSON.stringify(param));
obj['flowStatus'] = activeName.value;
if (obj['trackTime']) {
if (obj['trackTime'][0]) obj['trackTimeBegin'] = obj['trackTime'][0];
if (obj['trackTime'][1]) obj['trackTimeEnd'] = obj['trackTime'][1];
delete obj['trackTime'];
}
if (obj['nextTime']) {
if (obj['nextTime'][0]) obj['nextTrackTimeBegin'] = obj['nextTime'][0];
if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1];
delete obj['nextTime'];
}
setTimeout(() => {
const arr = JSON.parse(JSON.stringify(FlowStatus.value))
getRepayRecordTotal({...obj, flowStatus: null}).then(res => {
if (res.success) {
arr.forEach(item => {
const tt = res.result.find(v => v.flowStatus === item.value)
if (tt) {
item['msg'] = tt.number
} else {
item['msg'] = 0
}
})
tabs.value = arr
} else {
tabs.value = arr
}
}).catch(e => {
tabs.value = arr
})
}, 500)
return obj;
};
const changeStatus = async () => { const changeStatus = async () => {
showModal.value = true; showModal.value = true;
}; };
...@@ -218,7 +271,7 @@ ...@@ -218,7 +271,7 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
enum: FlowStatus, enum: FlowStatus,
search: { el: 'select', props: { filterable: true }, span: 1, labelWidth: 90 }, // search: { el: 'select', props: { filterable: true }, span: 1, labelWidth: 90 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
ref="caseLRef" ref="caseLRef"
:api="getTrackRecord" :api="getTrackRecord"
:selectdList="selectdList" :selectdList="selectdList"
:dataCallback="dataCallback"
:paramCallback="paramCallback" :paramCallback="paramCallback"
> >
<!-- 表格 header 按钮 --> <!-- 表格 header 按钮 -->
...@@ -51,12 +50,11 @@ ...@@ -51,12 +50,11 @@
import { ElMessageBox,ElMessage, ElButton, ElTag } from 'element-plus'; import { ElMessageBox,ElMessage, ElButton, ElTag } from 'element-plus';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { getTrackRecord } from '@/api/property'; import { getTrackRecord, getTrackRecordAuditTotal } from '@/api/property';
import { batchSave } from '@/api/audit'; import { batchSave } from '@/api/audit';
import { useUserStore } from '@/stores/modules/user'; import { useUserStore } from '@/stores/modules/user';
import { getTenantPage } from '@/api/tenant'; import { getTenantPage } from '@/api/tenant';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
import { watch } from 'vue';
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus"); const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus");
const envs = getAppEnvConfig(); const envs = getAppEnvConfig();
const { userInfo } = useUserStore(); const { userInfo } = useUserStore();
...@@ -74,52 +72,6 @@ ...@@ -74,52 +72,6 @@
const onCheckboxChange = (row) => { const onCheckboxChange = (row) => {
selectdList.value = row.records; selectdList.value = row.records;
}; };
watch(
() => AuditStatus.value,
(newValue, oldValue) => {
const list = []
if (AuditStatus && AuditStatus.value && AuditStatus.value.length) {
AuditStatus.value.forEach(async e => {
const param = {
current: 1,
size: 1,
auditStatus: e.value,
followStatus: [
'progress',
'pass_on',
'no_pass',
'Claims_unrelated_to_creditors',
'Claiming_not_to_be_myself',
]
}
const t = e.value
if (userInfo.id) {
param['createBy'] = userInfo.id;
}
let result = new Promise((resolve, reject) => {
getTrackRecord(param).then(res => {
const obj = {}
obj[e.value] = res
resolve(obj)
})
});
list.push(result)
})
}
Promise.all(list).then(res => {
console.log(res)
let tttt = {}
res.forEach(e => {
tttt = {...tttt, ...e}
})
AuditStatus.value.forEach(e => {
const obj = JSON.parse(JSON.stringify(e))
obj['msg'] = tttt[e.value].result.page.totalElements
tabs.value.push(obj)
})
})
}
);
const activeName = ref('un_audit'); const activeName = ref('un_audit');
const callMode = ref(''); const callMode = ref('');
...@@ -139,15 +91,33 @@ ...@@ -139,15 +91,33 @@
if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1]; if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1];
delete obj['nextTime']; delete obj['nextTime'];
} }
setTimeout(() => {
const arr = JSON.parse(JSON.stringify(AuditStatus.value))
getTrackRecordAuditTotal({...obj, auditStatus: null}).then(res => {
if (res.success) {
arr.forEach(item => {
const tt = res.result.find(v => v.auditStatus === item.value)
if (tt) {
item['msg'] = tt.number
} else {
item['msg'] = 0
}
})
tabs.value = arr
} else {
tabs.value = arr
}
}).catch(e => {
tabs.value = arr
})
}, 500)
// obj['voices'] = 'Y' // obj['voices'] = 'Y'
// obj['images'] = 'Y' // obj['images'] = 'Y'
// obj['notes'] = 'Y' // obj['notes'] = 'Y'
// obj['others'] = 'Y' // obj['others'] = 'Y'
return obj; return obj;
}; };
const dataCallback = (data) => {
console.log('data', data)
}
const callTelephone = (row, type) => { const callTelephone = (row, type) => {
callMode.value = type; callMode.value = type;
callDrawerRef.value.openModal(JSON.parse(JSON.stringify(row))); callDrawerRef.value.openModal(JSON.parse(JSON.stringify(row)));
...@@ -489,7 +459,6 @@ ...@@ -489,7 +459,6 @@
}; };
const query = () => { const query = () => {
caseLRef.value?.search() caseLRef.value?.search()
tabs.value
}; };
onMounted(() => { onMounted(() => {
......
<template> <template>
<div class="table-box"> <div class="table-box">
<div> <div>
<ProTable :config="config" ref="caseLRef" :api="getLoanpage" :paramCallback="paramCallback" :selectdList="selectdList"> <ProTable :config="config" ref="caseLRef" :api="getLoanBackpage" :paramCallback="paramCallback" :selectdList="selectdList">
<template #table_top> <template #table_top>
<div class="style-lable" style="width: 100%"> <div class="style-lable" style="width: 100%">
<div class="item_warp" style="width: 19%"> <div class="item_warp" style="width: 19%">
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
</div> </div>
<div class="title_warp"> <div class="title_warp">
<div class="items">待还金额</div> <div class="items">待还金额</div>
<div class="item items1">{{statisis.amount}}</div> <div class="item items1">{{statisis.unAmount}}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
</div> </div>
<div class="number-right"> <div class="number-right">
<p>收回客户数量</p> <p>收回客户数量</p>
<p>{{ statisis.unCustomerNum }}</p> <p>{{ statisis1.unCustomerNum }}</p>
</div> </div>
</div> </div>
<div class="number-box"> <div class="number-box">
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
</div> </div>
<div class="number-right"> <div class="number-right">
<p>收回案件数</p> <p>收回案件数</p>
<p>{{ statisis.unCaseNum }}</p> <p>{{ statisis1.unCaseNum }}</p>
</div> </div>
</div> </div>
<div class="number-box"> <div class="number-box">
...@@ -122,7 +122,7 @@ ...@@ -122,7 +122,7 @@
</template> </template>
<script setup name="case-allocation" lang="jsx"> <script setup name="case-allocation" lang="jsx">
import { getLoantotal, getLoanpage, getLoanDistribute, back, fullBack } from '@/api/allcation'; import { getLoanBacktotal, getLoanBackpage, getLoanBack, back, fullBack } from '@/api/allcation';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { ElMessageBox, ElMessage } from 'element-plus'; import { ElMessageBox, ElMessage } from 'element-plus';
import { VxeTextEllipsis, VxeTooltip } from 'vxe-pc-ui'; import { VxeTextEllipsis, VxeTooltip } from 'vxe-pc-ui';
...@@ -157,7 +157,7 @@ ...@@ -157,7 +157,7 @@
const statisis = ref({}); const statisis = ref({});
const statisis1 = ref({}); const statisis1 = ref({});
const getStatisis = (params) => { const getStatisis = (params) => {
getLoantotal(params).then((res) => { getLoanBacktotal(params).then((res) => {
if (res.success) { if (res.success) {
statisis.value = res.result; statisis.value = res.result;
} }
...@@ -170,7 +170,7 @@ ...@@ -170,7 +170,7 @@
} }
delete p['current']; delete p['current'];
delete p['size']; delete p['size'];
getLoanDistribute(p).then((res) => { getLoanBack(p).then((res) => {
if (res.success) { if (res.success) {
statisis1.value = res.result; statisis1.value = res.result;
} }
......
<template> <template>
<div class="table-box"> <div class="table-box">
<div> <div>
<ProTable :config="config" ref="caseLRef" :api="getLoanpage" :paramCallback="paramCallback" :selectdList="selectdList"> <ProTable :config="config" ref="caseLRef" :api="getLoanBackpage" :paramCallback="paramCallback" :selectdList="selectdList">
<template #table_top> <template #table_top>
<div class="style-lable" style="width: 100%"> <div class="style-lable" style="width: 100%">
<div class="item_warp" style="width: 19%"> <div class="item_warp" style="width: 19%">
...@@ -67,12 +67,47 @@ ...@@ -67,12 +67,47 @@
resize resize
v-model="showModal" v-model="showModal"
title="提示" title="提示"
height="242" height="342"
width="450" width="560"
show-footer show-footer
esc-closable esc-closable
> >
<div class="w-full px-3 h-full overflow-auto flex-col flex mytable"> <div class="top">
<div class="number-box">
<div class="number-left">
<div class="icon-wrapper">
<img src="@/assets/images/userlist.svg" />
</div>
</div>
<div class="number-right">
<p>收回客户数量</p>
<p>{{ statisis1.unCustomerNum }}</p>
</div>
</div>
<div class="number-box">
<div class="number-left">
<div class="icon-wrapper">
<img src="@/assets/images/caselist.svg" />
</div>
</div>
<div class="number-right">
<p>收回案件数</p>
<p>{{ statisis1.unCaseNum }}</p>
</div>
</div>
<div class="number-box">
<div class="number-left">
<div class="icon-wrapper">
<img src="@/assets/images/money.svg" />
</div>
</div>
<div class="number-right">
<p>预计收回金额</p>
<p>¥{{ statisis.unAmount }}</p>
</div>
</div>
</div>
<div class="w-full px-3 mt-3 overflow-auto flex-col flex mytable">
⚠️撤案处理后不可重新分派<br /> ⚠️撤案处理后不可重新分派<br />
撤案:只撤案未留案的案件<br /> 撤案:只撤案未留案的案件<br />
强制撤案:所有案件都会撤案,留案案件会被强制撤案<br /> 强制撤案:所有案件都会撤案,留案案件会被强制撤案<br />
...@@ -87,7 +122,7 @@ ...@@ -87,7 +122,7 @@
</template> </template>
<script setup name="case-allocation" lang="jsx"> <script setup name="case-allocation" lang="jsx">
import { getLoantotal, getLoanpage, backDistribute, fullWithdraw } from '@/api/allcation'; import { getLoanBacktotal, getLoanBackpage, getLoanBack, back, fullBack } from '@/api/allcation';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { ElMessageBox, ElMessage } from 'element-plus'; import { ElMessageBox, ElMessage } from 'element-plus';
import citydata from '../../../assets/citydata'; import citydata from '../../../assets/citydata';
...@@ -120,8 +155,9 @@ ...@@ -120,8 +155,9 @@
selectdList.value = row.records; selectdList.value = row.records;
}; };
const statisis = ref({}); const statisis = ref({});
const statisis1 = ref({});
const getStatisis = (params) => { const getStatisis = (params) => {
getLoantotal(params).then((res) => { getLoanBacktotal(params).then((res) => {
if (res.success) { if (res.success) {
statisis.value = res.result; statisis.value = res.result;
} }
...@@ -178,6 +214,19 @@ ...@@ -178,6 +214,19 @@
getStatisis(obj); getStatisis(obj);
return obj; return obj;
}; };
const getStatisis1 = (params, id) => {
const p = JSON.parse(JSON.stringify(params));
if (id) {
p['tenantId'] = id;
}
delete p['current'];
delete p['size'];
getLoanBack(p).then((res) => {
if (res.success) {
statisis1.value = res.result;
}
});
};
const backCase = async () => { const backCase = async () => {
if (dataValue.value === '对选中项操作' && (!selectdList.value || !selectdList.value.length)) { if (dataValue.value === '对选中项操作' && (!selectdList.value || !selectdList.value.length)) {
return ElMessage.warning({ return ElMessage.warning({
...@@ -185,6 +234,13 @@ ...@@ -185,6 +234,13 @@
plain: true, plain: true,
}); });
} }
let p = {}
if (dataValue.value === '对选中项操作') {
p['loanIds'] = selectdList.value.map((v) => v.id);
} else {
p = curParam.value;
}
getStatisis1(p);
showModal.value = true; showModal.value = true;
}; };
const onCheckboxAll = (flag) => { const onCheckboxAll = (flag) => {
...@@ -578,3 +634,33 @@ ...@@ -578,3 +634,33 @@
query(); query();
}); });
</script> </script>
<style lang="scss" scoped>
.top {
display: flex;
.number-box {
font-size: 15px;
width: 235px;
padding: 5px 0 5px 15px;
border: 1px solid rgba(0, 0, 0, 0.1);
height: 50px;
display: flex;
margin-right: 10px;
margin-top: 10px;
}
.icon-wrapper {
width: 40px;
height: 40px;
text-align: center;
line-height: 40px;
color: #bbc3ca;
margin-right: 10px;
font-size: 37px;
}
}
.number-right {
p:nth-child(1) {
color: #aaa;
font-size: 13px;
}
}
</style>
\ No newline at end of file
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
:config="config" :config="config"
ref="caseLRef" ref="caseLRef"
:api="getTrackRecord" :api="getTrackRecord"
:paramCallback="paramCallback"
:selectdList="selectdList" :selectdList="selectdList"
:paramCallback="paramCallback"
> >
<!-- 表格 header 按钮 --> <!-- 表格 header 按钮 -->
<template #left_buttons> <template #left_buttons>
...@@ -50,12 +50,11 @@ ...@@ -50,12 +50,11 @@
import { ElMessageBox,ElMessage, ElButton, ElTag } from 'element-plus'; import { ElMessageBox,ElMessage, ElButton, ElTag } from 'element-plus';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { getTrackRecord } from '@/api/property'; import { getTrackRecord, getTrackRecordAuditTotal } from '@/api/property';
import { batchSave } from '@/api/audit'; import { batchSave } from '@/api/audit';
import { useUserStore } from '@/stores/modules/user'; import { useUserStore } from '@/stores/modules/user';
import { getTenantPage } from '@/api/tenant'; import { getTenantPage } from '@/api/tenant';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
import { watch } from 'vue';
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus"); const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus");
const envs = getAppEnvConfig(); const envs = getAppEnvConfig();
const { userInfo } = useUserStore(); const { userInfo } = useUserStore();
...@@ -73,52 +72,6 @@ ...@@ -73,52 +72,6 @@
const onCheckboxChange = (row) => { const onCheckboxChange = (row) => {
selectdList.value = row.records; selectdList.value = row.records;
}; };
watch(
() => AuditStatus.value,
(newValue, oldValue) => {
const list = []
if (AuditStatus && AuditStatus.value && AuditStatus.value.length) {
AuditStatus.value.forEach(async e => {
const param = {
current: 1,
size: 1,
auditStatus: e.value,
followStatus: [
'progress',
'pass_on',
'no_pass',
'Claims_unrelated_to_creditors',
'Claiming_not_to_be_myself',
]
}
const t = e.value
if (userInfo.id) {
param['createBy'] = userInfo.id;
}
let result = new Promise((resolve, reject) => {
getTrackRecord(param).then(res => {
const obj = {}
obj[e.value] = res
resolve(obj)
})
});
list.push(result)
})
}
Promise.all(list).then(res => {
console.log(res)
let tttt = {}
res.forEach(e => {
tttt = {...tttt, ...e}
})
AuditStatus.value.forEach(e => {
const obj = JSON.parse(JSON.stringify(e))
obj['msg'] = tttt[e.value].result.page.totalElements
tabs.value.push(obj)
})
})
}
);
const activeName = ref('un_audit'); const activeName = ref('un_audit');
const callMode = ref(''); const callMode = ref('');
...@@ -138,6 +91,27 @@ ...@@ -138,6 +91,27 @@
if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1]; if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1];
delete obj['nextTime']; delete obj['nextTime'];
} }
setTimeout(() => {
const arr = JSON.parse(JSON.stringify(AuditStatus.value))
getTrackRecordAuditTotal({...obj, auditStatus: null}).then(res => {
if (res.success) {
arr.forEach(item => {
const tt = res.result.find(v => v.auditStatus === item.value)
if (tt) {
item['msg'] = tt.number
} else {
item['msg'] = 0
}
})
tabs.value = arr
} else {
tabs.value = arr
}
}).catch(e => {
tabs.value = arr
})
}, 500)
// obj['voices'] = 'Y' // obj['voices'] = 'Y'
// obj['images'] = 'Y' // obj['images'] = 'Y'
// obj['notes'] = 'Y' // obj['notes'] = 'Y'
...@@ -177,7 +151,7 @@ ...@@ -177,7 +151,7 @@
title: '案件ID', title: '案件ID',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true }, labelWidth: 95 }, search: { el: 'input', props: { clearable: true }, labelWidth: 105 },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return <>{Array.from(new Set(row.loans.map((v) => v.caseId))).join(',')}</>; return <>{Array.from(new Set(row.loans.map((v) => v.caseId))).join(',')}</>;
...@@ -192,7 +166,7 @@ ...@@ -192,7 +166,7 @@
search: { search: {
el: 'date-picker', el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' }, props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 95, labelWidth: 105,
}, },
}, },
{ {
...@@ -206,7 +180,7 @@ ...@@ -206,7 +180,7 @@
); );
}, },
}, },
search: { el: 'input', props: { clearable: true }, key: 'cpeName', labelWidth: 95 }, search: { el: 'input', props: { clearable: true }, key: 'cpeName', labelWidth: 105 },
}, },
{ {
showOverflow: 'tooltip', showOverflow: 'tooltip',
...@@ -218,7 +192,7 @@ ...@@ -218,7 +192,7 @@
}, },
}, },
enum: () => getTenantPage({ current: 1, size: 999999999, status: 'enable' }), enum: () => getTenantPage({ current: 1, size: 999999999, status: 'enable' }),
search: { el: 'select', props: { filterable: true }, key: 'tenantId', labelWidth: 95 }, search: { el: 'select', props: { filterable: true }, key: 'tenantId', labelWidth: 105 },
fieldNames: { label: 'name', value: 'id' }, fieldNames: { label: 'name', value: 'id' },
title: '调解中心', title: '调解中心',
width: 100, width: 100,
...@@ -231,7 +205,7 @@ ...@@ -231,7 +205,7 @@
search: { search: {
el: 'date-picker', el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' }, props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 95, labelWidth: 105,
}, },
}, },
{ {
...@@ -239,7 +213,7 @@ ...@@ -239,7 +213,7 @@
title: '联系人姓名', title: '联系人姓名',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 110, width: 110,
search: { el: 'input', props: { clearable: true }, key: 'guarantorName', labelWidth: 95 }, search: { el: 'input', props: { clearable: true }, key: 'guarantorName', labelWidth: 105 },
}, },
{ {
field: 'guarantor.phone', field: 'guarantor.phone',
...@@ -250,9 +224,9 @@ ...@@ -250,9 +224,9 @@
el: 'input', el: 'input',
props: { clearable: true }, props: { clearable: true },
key: 'guarantorPhone', key: 'guarantorPhone',
labelWidth: 95, labelWidth: 105,
}, },
labelWidth: 95, labelWidth: 105,
}, },
{ {
field: 'followStatus', field: 'followStatus',
...@@ -263,7 +237,7 @@ ...@@ -263,7 +237,7 @@
search: { search: {
el: 'select', el: 'select',
props: { filterable: true, multiple: true, 'collapse-tags': true }, props: { filterable: true, multiple: true, 'collapse-tags': true },
labelWidth: 95, labelWidth: 105,
defaultValue: [ defaultValue: [
'progress', 'progress',
'pass_on', 'pass_on',
...@@ -291,7 +265,7 @@ ...@@ -291,7 +265,7 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 120, width: 120,
enum: PhoneResultStatus, enum: PhoneResultStatus,
search: { el: 'select', props: { filterable: true }, labelWidth: 95 }, search: { el: 'select', props: { filterable: true }, labelWidth: 105 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
...@@ -327,7 +301,7 @@ ...@@ -327,7 +301,7 @@
title: '备注', title: '备注',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true }, labelWidth: 95 }, search: { el: 'input', props: { clearable: true }, labelWidth: 105 },
}, },
{ {
field: 'voices', field: 'voices',
...@@ -376,7 +350,7 @@ ...@@ -376,7 +350,7 @@
title: '超时状态', title: '超时状态',
width: 100, width: 100,
showOverflow: 'tooltip', showOverflow: 'tooltip',
// search: { el: 'select', props: { clearable: true }, labelWidth: 95 }, // search: { el: 'select', props: { clearable: true }, labelWidth: 105 },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
...@@ -483,7 +457,9 @@ ...@@ -483,7 +457,9 @@
}); });
query(); query();
}; };
const query = () => caseLRef.value?.search(); const query = () => {
caseLRef.value?.search()
};
onMounted(() => { onMounted(() => {
query(); query();
......
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