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

增加统计

parent 653ee653
......@@ -50,4 +50,16 @@ export const stayLoan = (params) => {
// 根据调节中心获取不同角色用户
export const 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) => {
export const getRepayRecordPage = (params) => {
return request.get('/repayRecord/page', params);
};
export const getRepayRecordTotal = (params) => {
return request.get('/repayRecord/flowStatusTotal', params);
};
// 还款申请批量
export const repayRecordFlowStatusByIds = (params) => {
return request.get('/repayRecord/flowStatusByIds', params);
......@@ -58,6 +61,9 @@ export const saveReduce = (data) => {
export const getReducePage = (params) => {
return request.get('/reduce/page', params);
};
export const getReduceTotal = (params) => {
return request.get('/reduce/flowStatusTotal', params);
};
// 减免申请批量
export const flowStatusByIds = (params) => {
return request.get('/reduce/flowStatusByIds', params);
......@@ -75,6 +81,10 @@ export const changeAmount = (data) => {
export const getByStagesPage = (params) => {
return request.get('/byStages/page', params);
};
// 分期申请列表
export const getByStagesTotal = (params) => {
return request.get('/byStages/flowStatusTotal', params);
};
// 分期申请批量审核
export const byStagesflowStatusByIds = (params) => {
return request.get('/byStages/flowStatusByIds', params);
......@@ -88,7 +98,14 @@ export const saveTrackRecord = (data) => {
export const getTrackRecord = (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) => {
return request.post('/RepairRecord/save', data);
......@@ -97,6 +114,9 @@ export const saveRepairRecord = (data) => {
export const getRepairRecord = (params) => {
return request.get('/RepairRecord/page', params);
};
export const getRepairRecordTotal = (params) => {
return request.get('/RepairRecord/flowStatusTotal', params);
};
export const importExcel = (params) => {
return request.get('/RepairRecord/importExcel', params);
};
......
......@@ -26,7 +26,7 @@ body,
line-height: 28px !important;
}
.el-form-item {
margin-bottom: 10px !important;
margin-bottom: 15px !important;
}
.el-tabs__item {
font-size: 13px !important;
......
......@@ -15,7 +15,7 @@
<script setup name="systemLog" lang="jsx">
import { computed } from 'vue';
import { reactive, ref } from 'vue';
import { getTrackRecord } from '@/api/property';
import { getTrackRecord, getTrackRecordTotal } from '@/api/property';
import { onMounted } from 'vue';
import { getAppEnvConfig } from '@/utils/env';
import { ElMessageBox, ElMessage, ElButton, ElTag } from 'element-plus';
......
<template>
<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>
<!-- <el-button type="primary">下载申请 </el-button> -->
<el-button
......@@ -142,7 +159,7 @@
import { computed } from 'vue';
import { inject } 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 { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { Download } from '@element-plus/icons-vue';
......@@ -154,6 +171,8 @@
const RefImage = ref(false);
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus", "CaseStatus");
const downloadfile = inject('download');
const activeName = ref('pending');
const tabs = ref([]);
const ProTableRef = ref();
const showModal = ref(false);
......@@ -162,6 +181,46 @@
console.log('row', row);
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 name = item.slice(item.lastIndexOf('/') + 1, item.length);
downloadfile('/sys/static/' + item, {}, name);
......@@ -396,7 +455,7 @@
showOverflow: 'tooltip',
width: 80,
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' },
slots: {
default: ({ row }) => {
......
<template>
<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>
<!-- <el-button type="primary">下载申请 </el-button> -->
<el-button
......@@ -116,7 +133,7 @@
<script setup name="systemLog" lang="jsx">
import { computed } 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 { inject } from 'vue';
import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
......@@ -130,17 +147,53 @@
const downloadfile = inject('download');
const ProTableRef = ref();
const showModal = ref(false);
const tabs = ref([]);
const srcList = ref([]);
const activeName = ref('pending');
const RefImage = ref(false);
const selectdList = ref([]);
const onCheckboxChange = (row) => {
console.log('row', row);
selectdList.value = row.records;
};
const download = (item) => {
const name = item.slice(item.lastIndexOf('/') + 1, item.length);
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) => {
if (flag.checked) {
selectdList.value = flag.records;
......@@ -151,6 +204,11 @@
const changeStatus = async () => {
showModal.value = true;
};
const handleClick = () => {
setTimeout(() => {
query();
}, 300);
};
const preview = (item, type) => {
const list = [];
item[type].forEach((v) => {
......@@ -296,7 +354,7 @@
showOverflow: 'tooltip',
width: 80,
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' },
slots: {
default: ({ row }) => {
......
<template>
<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>
<!-- <el-button type="primary">下载申请 </el-button> -->
<el-button
......@@ -38,7 +55,7 @@
import { computed } from 'vue';
import { onMounted } 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 { getTenantPage } from '@/api/tenant';
import { useDict } from '@/hooks/useDict';
......@@ -46,6 +63,8 @@
const tabledata = ref([]);
const showModal = ref(false);
const tabs = ref([]);
const activeName = ref('pending');
const caseLRef = ref();
const selectdList = ref([]);
const onCheckboxChange = (row) => {
......@@ -59,6 +78,46 @@
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 () => {
showModal.value = true;
};
......@@ -201,7 +260,7 @@
title: '审核状态',
width: 95,
enum: FlowStatus,
search: { el: 'select', props: { filterable: true }, labelWidth: 105 },
// search: { el: 'select', props: { filterable: true }, labelWidth: 105 },
fieldNames: { label: 'label', value: 'value' },
slots: {
default: ({ row }) => {
......
<template>
<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>
<!-- <el-button type="primary">下载申请 </el-button> -->
<el-button
......@@ -37,7 +54,7 @@
<script setup name="repaymentApprove" lang="jsx">
import { computed } 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 { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { useDict } from '@/hooks/useDict';
......@@ -45,6 +62,8 @@
const { RepayType, FlowStatus } = useDict("RepayType", "FlowStatus");
const ProTableRef = ref();
const showModal = ref(false);
const activeName = ref('pending');
const tabs = ref([]);
const selectdList = ref([]);
const onCheckboxChange = (row) => {
console.log('row', row);
......@@ -57,7 +76,41 @@
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 () => {
showModal.value = true;
};
......@@ -218,7 +271,7 @@
showOverflow: 'tooltip',
width: 80,
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' },
slots: {
default: ({ row }) => {
......
......@@ -23,7 +23,6 @@
ref="caseLRef"
:api="getTrackRecord"
:selectdList="selectdList"
:dataCallback="dataCallback"
:paramCallback="paramCallback"
>
<!-- 表格 header 按钮 -->
......@@ -51,12 +50,11 @@
import { ElMessageBox,ElMessage, ElButton, ElTag } from 'element-plus';
import { onMounted } from 'vue';
import { getAppEnvConfig } from '@/utils/env';
import { getTrackRecord } from '@/api/property';
import { getTrackRecord, getTrackRecordAuditTotal } from '@/api/property';
import { batchSave } from '@/api/audit';
import { useUserStore } from '@/stores/modules/user';
import { getTenantPage } from '@/api/tenant';
import { useDict } from '@/hooks/useDict';
import { watch } from 'vue';
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus");
const envs = getAppEnvConfig();
const { userInfo } = useUserStore();
......@@ -74,52 +72,6 @@
const onCheckboxChange = (row) => {
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 callMode = ref('');
......@@ -139,15 +91,33 @@
if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1];
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['images'] = 'Y'
// obj['notes'] = 'Y'
// obj['others'] = 'Y'
return obj;
};
const dataCallback = (data) => {
console.log('data', data)
}
const callTelephone = (row, type) => {
callMode.value = type;
callDrawerRef.value.openModal(JSON.parse(JSON.stringify(row)));
......@@ -489,7 +459,6 @@
};
const query = () => {
caseLRef.value?.search()
tabs.value
};
onMounted(() => {
......
<template>
<div class="table-box">
<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>
<div class="style-lable" style="width: 100%">
<div class="item_warp" style="width: 19%">
......@@ -37,7 +37,7 @@
</div>
<div class="title_warp">
<div class="items">待还金额</div>
<div class="item items1">{{statisis.amount}}</div>
<div class="item items1">{{statisis.unAmount}}</div>
</div>
</div>
</div>
......@@ -81,7 +81,7 @@
</div>
<div class="number-right">
<p>收回客户数量</p>
<p>{{ statisis.unCustomerNum }}</p>
<p>{{ statisis1.unCustomerNum }}</p>
</div>
</div>
<div class="number-box">
......@@ -92,7 +92,7 @@
</div>
<div class="number-right">
<p>收回案件数</p>
<p>{{ statisis.unCaseNum }}</p>
<p>{{ statisis1.unCaseNum }}</p>
</div>
</div>
<div class="number-box">
......@@ -122,7 +122,7 @@
</template>
<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 { ElMessageBox, ElMessage } from 'element-plus';
import { VxeTextEllipsis, VxeTooltip } from 'vxe-pc-ui';
......@@ -157,7 +157,7 @@
const statisis = ref({});
const statisis1 = ref({});
const getStatisis = (params) => {
getLoantotal(params).then((res) => {
getLoanBacktotal(params).then((res) => {
if (res.success) {
statisis.value = res.result;
}
......@@ -170,7 +170,7 @@
}
delete p['current'];
delete p['size'];
getLoanDistribute(p).then((res) => {
getLoanBack(p).then((res) => {
if (res.success) {
statisis1.value = res.result;
}
......
<template>
<div class="table-box">
<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>
<div class="style-lable" style="width: 100%">
<div class="item_warp" style="width: 19%">
......@@ -67,12 +67,47 @@
resize
v-model="showModal"
title="提示"
height="242"
width="450"
height="342"
width="560"
show-footer
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 />
......@@ -87,7 +122,7 @@
</template>
<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 { ElMessageBox, ElMessage } from 'element-plus';
import citydata from '../../../assets/citydata';
......@@ -120,8 +155,9 @@
selectdList.value = row.records;
};
const statisis = ref({});
const statisis1 = ref({});
const getStatisis = (params) => {
getLoantotal(params).then((res) => {
getLoanBacktotal(params).then((res) => {
if (res.success) {
statisis.value = res.result;
}
......@@ -178,6 +214,19 @@
getStatisis(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 () => {
if (dataValue.value === '对选中项操作' && (!selectdList.value || !selectdList.value.length)) {
return ElMessage.warning({
......@@ -185,6 +234,13 @@
plain: true,
});
}
let p = {}
if (dataValue.value === '对选中项操作') {
p['loanIds'] = selectdList.value.map((v) => v.id);
} else {
p = curParam.value;
}
getStatisis1(p);
showModal.value = true;
};
const onCheckboxAll = (flag) => {
......@@ -578,3 +634,33 @@
query();
});
</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 @@
:config="config"
ref="caseLRef"
:api="getTrackRecord"
:paramCallback="paramCallback"
:selectdList="selectdList"
:paramCallback="paramCallback"
>
<!-- 表格 header 按钮 -->
<template #left_buttons>
......@@ -50,12 +50,11 @@
import { ElMessageBox,ElMessage, ElButton, ElTag } from 'element-plus';
import { onMounted } from 'vue';
import { getAppEnvConfig } from '@/utils/env';
import { getTrackRecord } from '@/api/property';
import { getTrackRecord, getTrackRecordAuditTotal } from '@/api/property';
import { batchSave } from '@/api/audit';
import { useUserStore } from '@/stores/modules/user';
import { getTenantPage } from '@/api/tenant';
import { useDict } from '@/hooks/useDict';
import { watch } from 'vue';
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus");
const envs = getAppEnvConfig();
const { userInfo } = useUserStore();
......@@ -73,52 +72,6 @@
const onCheckboxChange = (row) => {
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 callMode = ref('');
......@@ -138,6 +91,27 @@
if (obj['nextTime'][1]) obj['nextTrackTimeEnd'] = obj['nextTime'][1];
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['images'] = 'Y'
// obj['notes'] = 'Y'
......@@ -177,7 +151,7 @@
title: '案件ID',
showOverflow: 'tooltip',
width: 80,
search: { el: 'input', props: { clearable: true }, labelWidth: 95 },
search: { el: 'input', props: { clearable: true }, labelWidth: 105 },
slots: {
default: ({ row }) => {
return <>{Array.from(new Set(row.loans.map((v) => v.caseId))).join(',')}</>;
......@@ -192,7 +166,7 @@
search: {
el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 95,
labelWidth: 105,
},
},
{
......@@ -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',
......@@ -218,7 +192,7 @@
},
},
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' },
title: '调解中心',
width: 100,
......@@ -231,7 +205,7 @@
search: {
el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 95,
labelWidth: 105,
},
},
{
......@@ -239,7 +213,7 @@
title: '联系人姓名',
showOverflow: 'tooltip',
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',
......@@ -250,9 +224,9 @@
el: 'input',
props: { clearable: true },
key: 'guarantorPhone',
labelWidth: 95,
labelWidth: 105,
},
labelWidth: 95,
labelWidth: 105,
},
{
field: 'followStatus',
......@@ -263,7 +237,7 @@
search: {
el: 'select',
props: { filterable: true, multiple: true, 'collapse-tags': true },
labelWidth: 95,
labelWidth: 105,
defaultValue: [
'progress',
'pass_on',
......@@ -291,7 +265,7 @@
showOverflow: 'tooltip',
width: 120,
enum: PhoneResultStatus,
search: { el: 'select', props: { filterable: true }, labelWidth: 95 },
search: { el: 'select', props: { filterable: true }, labelWidth: 105 },
fieldNames: { label: 'label', value: 'value' },
slots: {
default: ({ row }) => {
......@@ -327,7 +301,7 @@
title: '备注',
showOverflow: 'tooltip',
width: 80,
search: { el: 'input', props: { clearable: true }, labelWidth: 95 },
search: { el: 'input', props: { clearable: true }, labelWidth: 105 },
},
{
field: 'voices',
......@@ -376,7 +350,7 @@
title: '超时状态',
width: 100,
showOverflow: 'tooltip',
// search: { el: 'select', props: { clearable: true }, labelWidth: 95 },
// search: { el: 'select', props: { clearable: true }, labelWidth: 105 },
slots: {
default: ({ row }) => {
return (
......@@ -483,7 +457,9 @@
});
query();
};
const query = () => caseLRef.value?.search();
const query = () => {
caseLRef.value?.search()
};
onMounted(() => {
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