Commit 12dfdf1c authored by 沈翠玲's avatar 沈翠玲

优化界面

parent 85f4d2c0
...@@ -15,4 +15,3 @@ export const auditAudit = (params) => { ...@@ -15,4 +15,3 @@ export const auditAudit = (params) => {
export const batchSave = (params) => { export const batchSave = (params) => {
return request.get('/TrackRecord/batchSave', params); return request.get('/TrackRecord/batchSave', params);
}; };
...@@ -83,4 +83,4 @@ export const saveTrackRecord = (data) => { ...@@ -83,4 +83,4 @@ export const saveTrackRecord = (data) => {
// 案件跟踪记录列表 // 案件跟踪记录列表
export const getTrackRecord = (params) => { export const getTrackRecord = (params) => {
return request.get('/TrackRecord/page', params); return request.get('/TrackRecord/page', params);
}; };
\ No newline at end of file
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
}, },
collapsedRows: { collapsedRows: {
type: Number, type: Number,
default: 1, default: 0.8,
}, },
data: { data: {
type: Array, type: Array,
......
...@@ -16,18 +16,24 @@ ...@@ -16,18 +16,24 @@
> >
<el-form-item> <el-form-item>
<template #label> <template #label>
<el-space :size="4"> <div
<span>{{ `${item.search?.label ?? item.title}` }}</span> :style="{
<el-tooltip width: item.search.labelWidth ? `${item.search.labelWidth}px` : auto,
v-if="item.search?.tooltip" 'text-align': 'right',
effect="dark" }"
:content="item.search?.tooltip" >
placement="top" <el-space :size="4">
> <span>{{ `${item.search?.label ?? item.title}` }}</span>
<i :class="'iconfont icon-yiwen'"></i> <el-tooltip
</el-tooltip> v-if="item.search?.tooltip"
</el-space> effect="dark"
<span>&nbsp;:</span> :content="item.search?.tooltip"
placement="top"
>
<i :class="'iconfont icon-yiwen'"></i>
</el-tooltip>
</el-space>
</div>
</template> </template>
<SearchFormItem :column="item" :search-param="searchParam" /> <SearchFormItem :column="item" :search-param="searchParam" />
</el-form-item> </el-form-item>
......
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
}; };
const openModal = (tenants) => { const openModal = (tenants) => {
showModal.value = true showModal.value = true;
tenantList.value = tenants tenantList.value = tenants;
}; };
defineExpose({ defineExpose({
openModal, openModal,
......
...@@ -7,24 +7,33 @@ ...@@ -7,24 +7,33 @@
</el-badge> </el-badge>
</template> </template>
<!-- <el-tabs v-model="activeName"> --> <!-- <el-tabs v-model="activeName"> -->
<!-- <el-tab-pane label="通知(5)" name="first"> --> <!-- <el-tab-pane label="通知(5)" name="first"> -->
<div class="message-list"> <div class="message-list">
<div class="message-item" v-for="(item, index) in msgList" :key="index" @click="clickMessage(item)"> <div
<img :src="item.serviceType ==='tip' ? msg02 : msg01" alt="" class="message-icon" /> class="message-item"
<div class="message-content"> v-for="(item, index) in msgList"
<span class="message-title" :class="{' text-gray-400' : item.messageReads && item.messageReads.length}">{{item.title}}</span> :key="index"
<span class="message-date">{{timeago(item.sendTime)}}</span> @click="clickMessage(item)"
</div> >
</div> <img :src="item.serviceType === 'tip' ? msg02 : msg01" alt="" class="message-icon" />
<!-- <div class="message-item"> <div class="message-content">
<span
class="message-title"
:class="{ ' text-gray-400': item.messageReads && item.messageReads.length }"
>{{ item.title }}</span
>
<span class="message-date">{{ timeago(item.sendTime) }}</span>
</div>
</div>
<!-- <div class="message-item">
<img src="@/assets/images/msg02.png" alt="" class="message-icon" /> <img src="@/assets/images/msg02.png" alt="" class="message-icon" />
<div class="message-content"> <div class="message-content">
<span class="message-title">一键三连 Geeker-Admin 💙</span> <span class="message-title">一键三连 Geeker-Admin 💙</span>
<span class="message-date">一小时前</span> <span class="message-date">一小时前</span>
</div> </div>
</div> --> </div> -->
</div> </div>
<!-- </el-tab-pane> <!-- </el-tab-pane>
<el-tab-pane label="消息(0)" name="second"> <el-tab-pane label="消息(0)" name="second">
<div class="message-empty"> <div class="message-empty">
<img src="@/assets/images/notData.png" alt="notData" /> <img src="@/assets/images/notData.png" alt="notData" />
...@@ -39,20 +48,15 @@ ...@@ -39,20 +48,15 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> --> </el-tabs> -->
</el-popover> </el-popover>
<el-popover <el-popover :visible="visible" placement="bottom" title="收到1条新消息" :width="200">
:visible="visible"
placement="bottom"
title="收到1条新消息"
:width="200"
>
<template #reference> <template #reference>
<el-badge class="item"> <el-badge class="item">
<i :class="'iconfont icon-xiaoxi'" class="toolBar-icon" style="display: none"></i> <i :class="'iconfont icon-xiaoxi'" class="toolBar-icon" style="display: none"></i>
</el-badge> </el-badge>
</template> </template>
<div> <div>
{{socketStore.msg.title}} {{ socketStore.msg.title }}
</div> </div>
</el-popover> </el-popover>
</div> </div>
</template> </template>
...@@ -60,7 +64,7 @@ ...@@ -60,7 +64,7 @@
<script setup> <script setup>
import { reactive, ref, watch } from 'vue'; import { reactive, ref, watch } from 'vue';
import useSocketStore from '../../../../stores/modules/websocket'; import useSocketStore from '../../../../stores/modules/websocket';
import {useUserStore} from '../../../../stores/modules/user'; import { useUserStore } from '../../../../stores/modules/user';
import msg02 from '@/assets/images/msg02.png'; import msg02 from '@/assets/images/msg02.png';
import msg01 from '@/assets/images/msg01.png'; import msg01 from '@/assets/images/msg01.png';
import { computed, onMounted } from 'vue'; import { computed, onMounted } from 'vue';
...@@ -71,100 +75,102 @@ ...@@ -71,100 +75,102 @@
const activeName = ref('first'); const activeName = ref('first');
const msgList = ref([]); const msgList = ref([]);
const newMsgList = ref([]); const newMsgList = ref([]);
const visible = ref(false) const visible = ref(false);
const socketStore = useSocketStore(); const socketStore = useSocketStore();
console.log('socketStore', socketStore) console.log('socketStore', socketStore);
const query = () => { const query = () => {
pageMyMesage({ pageMyMesage({
current: 1, current: 1,
readStatus: 'read', readStatus: 'read',
size: 100 size: 100,
}).then((res) => { }).then((res) => {
console.log('sadas', res) console.log('sadas', res);
if(res.success && res.result) { if (res.success && res.result) {
msgList.value = res.result.content msgList.value = res.result.content;
} }
}); });
} };
watch(() => socketStore.msg, (newValue, oldValue) => { watch(
if(newValue instanceof Array){ () => socketStore.msg,
newMsgList.value.push(newValue) (newValue, oldValue) => {
visible.value = true if (newValue instanceof Array) {
newMsgList.value.push(newValue);
visible.value = true;
}
query();
} }
query() );
});
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
const envs = getAppEnvConfig(); const envs = getAppEnvConfig();
const { userInfo } = useUserStore(); const { userInfo } = useUserStore();
if(!socketStore.ws && userInfo.id) { if (!socketStore.ws && userInfo.id) {
let url = `ws://8.152.205.9:8080/websocket/${userInfo.id}`; let url = `ws://8.152.205.9:8080/websocket/${userInfo.id}`;
console.log('url', url) console.log('url', url);
socketStore.connection(url); socketStore.connection(url);
} }
if (socketStore.ws){ if (socketStore.ws) {
socketStore.sendMsg({ aa: 44 }); socketStore.sendMsg({ aa: 44 });
} }
const clickMsg = () => { const clickMsg = () => {
visible.value = false visible.value = false;
newMsgList.value = [] newMsgList.value = [];
} };
const clickMessage = (item) => { const clickMessage = (item) => {
readMessage({ readMessage({
msgId: item.id msgId: item.id,
}).then(res => { }).then((res) => {
router.push({ router.push({
path: '/workplace/todo' path: '/workplace/todo',
}); });
query() query();
}) });
} };
const timeago = (time) => { const timeago = (time) => {
const data = new Date(time); const data = new Date(time);
const dateTimeStamp = data.getTime() const dateTimeStamp = data.getTime();
const minute = 1000 * 60; //把分,时,天,周,半个月,一个月用毫秒表示 const minute = 1000 * 60; //把分,时,天,周,半个月,一个月用毫秒表示
const hour = minute * 60; const hour = minute * 60;
const day = hour * 24; const day = hour * 24;
const week = day * 7; const week = day * 7;
const month = day * 30; const month = day * 30;
const year = month * 12; const year = month * 12;
const now = new Date().getTime(); //获取当前时间毫秒 const now = new Date().getTime(); //获取当前时间毫秒
const diffValue = now - dateTimeStamp;//时间差 const diffValue = now - dateTimeStamp; //时间差
let result = ""; let result = '';
if (diffValue < 0) { if (diffValue < 0) {
result = "" + "未来"; result = '' + '未来';
} }
const minC = diffValue / minute; //计算时间差的分,时,天,周,月 const minC = diffValue / minute; //计算时间差的分,时,天,周,月
const hourC = diffValue / hour; const hourC = diffValue / hour;
const dayC = diffValue / day; const dayC = diffValue / day;
const weekC = diffValue / week; const weekC = diffValue / week;
const monthC = diffValue / month; const monthC = diffValue / month;
const yearC = diffValue / year; const yearC = diffValue / year;
if (yearC >= 1) { if (yearC >= 1) {
result = " " + parseInt(yearC) + "年前" result = ' ' + parseInt(yearC) + '年前';
} else if (monthC >= 1 && monthC < 12) { } else if (monthC >= 1 && monthC < 12) {
result = " " + parseInt(monthC) + "月前" result = ' ' + parseInt(monthC) + '月前';
} else if (weekC >= 1 && weekC < 5 && dayC > 6 && monthC < 1) { } else if (weekC >= 1 && weekC < 5 && dayC > 6 && monthC < 1) {
result = " " + parseInt(weekC) + "周前" result = ' ' + parseInt(weekC) + '周前';
} else if (dayC >= 1 && dayC <= 6) { } else if (dayC >= 1 && dayC <= 6) {
result = " " + parseInt(dayC) + "天前" result = ' ' + parseInt(dayC) + '天前';
} else if (hourC >= 1 && hourC <= 23) { } else if (hourC >= 1 && hourC <= 23) {
result = " " + parseInt(hourC) + "小时前" result = ' ' + parseInt(hourC) + '小时前';
} else if (minC >= 1 && minC <= 59) { } else if (minC >= 1 && minC <= 59) {
result = " " + parseInt(minC) + "分钟前" result = ' ' + parseInt(minC) + '分钟前';
} else if (diffValue >= 0 && diffValue <= minute) { } else if (diffValue >= 0 && diffValue <= minute) {
result = "刚刚" result = '刚刚';
} }
console.log(result) console.log(result);
return result return result;
} };
onMounted(() => { onMounted(() => {
query(); query();
}); });
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
......
...@@ -14,4 +14,4 @@ body, ...@@ -14,4 +14,4 @@ body,
} }
.vxe-modal--container { .vxe-modal--container {
max-height: 100vh; max-height: 100vh;
} }
\ No newline at end of file
...@@ -76,7 +76,9 @@ ...@@ -76,7 +76,9 @@
type="datetime" type="datetime"
/> />
<div> <div>
<el-button size="small" disabled @click="changeLastTime('tomorrow')">明天</el-button> <el-button size="small" disabled @click="changeLastTime('tomorrow')"
>明天</el-button
>
<el-button size="small" disabled @click="changeLastTime('tomorrowDay')" <el-button size="small" disabled @click="changeLastTime('tomorrowDay')"
>后天</el-button >后天</el-button
> >
...@@ -219,7 +221,9 @@ ...@@ -219,7 +221,9 @@
<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" v-if="props.mode === 'handle'">确定</el-button> <el-button type="primary" @click="submitForm" v-if="props.mode === 'handle'"
>确定</el-button
>
<template v-else> <template v-else>
<el-button type="primary" @click="submitForm('pass')">通过</el-button> <el-button type="primary" @click="submitForm('pass')">通过</el-button>
<el-button type="danger" @click="submitForm('rejected')">拒绝</el-button> <el-button type="danger" @click="submitForm('rejected')">拒绝</el-button>
...@@ -250,7 +254,7 @@ ...@@ -250,7 +254,7 @@
const dialogImageUrl = ref(''); const dialogImageUrl = ref('');
const dialogVisible = ref(false); const dialogVisible = ref(false);
const props = defineProps({ const props = defineProps({
mode: String mode: String,
}); });
const emits = defineEmits(['success']); const emits = defineEmits(['success']);
const tabObj = [ const tabObj = [
...@@ -448,17 +452,37 @@ ...@@ -448,17 +452,37 @@
const openModal = (info) => { const openModal = (info) => {
showModal.value = true; showModal.value = true;
currentInfo.value = info; currentInfo.value = info;
form.trackTime = info.trackTime form.trackTime = info.trackTime;
form.remark = info.remark form.remark = info.remark;
form.phoneResultStatus = info.phoneResultStatus form.phoneResultStatus = info.phoneResultStatus;
resuleObj.childrenlabel = info.followStatus resuleObj.childrenlabel = info.followStatus;
form.nextTime = info.nextTime form.nextTime = info.nextTime;
form.notes = info.notes ? info.notes.map(v => ({name: v.slice(v.lastIndexOf('/') + 1, v.length), url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v})) : [] form.notes = info.notes
form.voices = info.voices ? info.voices.map(v => ({name: v.slice(v.lastIndexOf('/') + 1, v.length), url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v})) : [] ? info.notes.map((v) => ({
form.images = info.images ? info.images.map(v => ({name: v.slice(v.lastIndexOf('/') + 1, v.length), url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v})) : [] name: v.slice(v.lastIndexOf('/') + 1, v.length),
form.others = info.others ? info.others.map(v => ({name: v.slice(v.lastIndexOf('/') + 1, v.length), url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v})) : [] url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v,
}))
: [];
form.voices = info.voices
? info.voices.map((v) => ({
name: v.slice(v.lastIndexOf('/') + 1, v.length),
url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v,
}))
: [];
form.images = info.images
? info.images.map((v) => ({
name: v.slice(v.lastIndexOf('/') + 1, v.length),
url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v,
}))
: [];
form.others = info.others
? info.others.map((v) => ({
name: v.slice(v.lastIndexOf('/') + 1, v.length),
url: envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v,
}))
: [];
tabledata.value = info.loans; tabledata.value = info.loans;
console.log('formform', form) console.log('formform', form);
}; };
const submitForm = (type) => { const submitForm = (type) => {
saveTrackRecord({ saveTrackRecord({
......
<template> <template>
<div class="table-box"> <div class="table-box">
<div> <div>
<ProTable :config="config" ref="caseLRef" :api="getTrackRecord" :paramCallback="paramCallback"> <ProTable
:config="config"
ref="caseLRef"
:api="getTrackRecord"
:paramCallback="paramCallback"
>
<template #table_top> <template #table_top>
<div> <div>
<el-tabs <el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
v-model="activeName" <el-tab-pane
type="card" :label="item.label"
class="demo-tabs" :name="item.value"
@tab-click="handleClick" v-for="(item, index) in auditStatusOpt"
> :key="index"
<el-tab-pane :label="item.label" :name="item.value" v-for="(item, index) in auditStatusOpt" :key="index"></el-tab-pane> ></el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</template> </template>
...@@ -35,15 +40,11 @@ ...@@ -35,15 +40,11 @@
import { inject } from 'vue'; import { inject } from 'vue';
import { computed } from 'vue'; import { computed } from 'vue';
import callDrawer from './components/callDrawer.vue'; import callDrawer from './components/callDrawer.vue';
import { ElMessageBox, ElMessage,ElButton } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { import { getTrackRecord } from '@/api/property';
getTrackRecord import { batchSave } from '@/api/audit';
} from '@/api/property';
import {
batchSave
} from '@/api/audit';
const envs = getAppEnvConfig(); const envs = getAppEnvConfig();
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
const downloadfile = inject('download'); const downloadfile = inject('download');
...@@ -93,13 +94,13 @@ ...@@ -93,13 +94,13 @@
{ label: '未稽核', value: 'un_audit' }, { label: '未稽核', value: 'un_audit' },
{ label: '稽核中', value: 'audit' }, { label: '稽核中', value: 'audit' },
{ label: '已拒绝', value: 'rejected' }, { label: '已拒绝', value: 'rejected' },
{ label: '已完成', value: 'complete' } { label: '已完成', value: 'complete' },
]; ];
const activeName = ref('un_audit') const activeName = ref('un_audit');
const callMode = ref('') const callMode = ref('');
const paramCallback = (param) => { const paramCallback = (param) => {
const obj = JSON.parse(JSON.stringify(param)); const obj = JSON.parse(JSON.stringify(param));
obj['auditStatus'] = activeName.value obj['auditStatus'] = activeName.value;
if (obj['trackTime']) { if (obj['trackTime']) {
if (obj['trackTime'][0]) obj['trackTimeBegin'] = obj['trackTime'][0]; if (obj['trackTime'][0]) obj['trackTimeBegin'] = obj['trackTime'][0];
if (obj['trackTime'][1]) obj['trackTimeEnd'] = obj['trackTime'][1]; if (obj['trackTime'][1]) obj['trackTimeEnd'] = obj['trackTime'][1];
...@@ -117,14 +118,14 @@ ...@@ -117,14 +118,14 @@
return obj; return obj;
}; };
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)));
}; };
const handleClick = () =>{ const handleClick = () => {
setTimeout(() => { setTimeout(() => {
query() query();
}, 300); }, 300);
} };
const config = computed(() => { const config = computed(() => {
return { return {
columns: [ columns: [
...@@ -134,14 +135,10 @@ ...@@ -134,14 +135,10 @@
field: 'caseId', field: 'caseId',
title: '案件ID', title: '案件ID',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return <>{row.loans.map((v) => v.caseId).join(',')}</>;
<>
{row.loans.map(v => v.caseId).join(',')}
</>
);
}, },
}, },
}, },
...@@ -151,7 +148,8 @@ ...@@ -151,7 +148,8 @@
width: 100, width: 100,
search: { search: {
el: 'date-picker', el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' } props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 85,
}, },
}, },
{ {
...@@ -161,26 +159,44 @@ ...@@ -161,26 +159,44 @@
search: { search: {
el: 'date-picker', el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' }, props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 85,
}, },
}, },
{ {
field: 'guarantor.name', field: 'guarantor.name',
title: '联系人姓名', title: '联系人姓名',
width: 110, width: 110,
search: { el: 'input', props: { clearable: true }, key: 'guarantorName' }, search: { el: 'input', props: { clearable: true }, key: 'guarantorName', labelWidth: 85 },
}, },
{ {
field: 'guarantor.phone', field: 'guarantor.phone',
title: '联系人号码', title: '联系人号码',
width: 110, width: 110,
search: { el: 'input', props: { clearable: true }, key: 'guarantorPhone' }, search: {
el: 'input',
props: { clearable: true },
key: 'guarantorPhone',
labelWidth: 85,
},
labelWidth: 85,
}, },
{ {
field: 'followStatus', field: 'followStatus',
title: '拨打跟进结果', title: '拨打跟进结果',
width: 120, width: 120,
enum: followStatusOpt, enum: followStatusOpt,
search: { el: 'select', props: { filterable: true, multiple: true}, span: 1, defaultValue: ['progress', 'pass_on', 'no_pass', 'Claims_unrelated_to_creditors', 'Claiming_not_to_be_myself'] }, search: {
el: 'select',
props: { filterable: true, multiple: true, 'collapse-tags': true },
labelWidth: 85,
defaultValue: [
'progress',
'pass_on',
'no_pass',
'Claims_unrelated_to_creditors',
'Claiming_not_to_be_myself',
],
},
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
...@@ -199,7 +215,7 @@ ...@@ -199,7 +215,7 @@
title: '拨打处置状态', title: '拨打处置状态',
width: 120, width: 120,
enum: phoneResultStatusOpt, enum: phoneResultStatusOpt,
search: { el: 'select', props: { filterable: true }, span: 1 }, search: { el: 'select', props: { filterable: true }, labelWidth: 85 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
...@@ -233,7 +249,7 @@ ...@@ -233,7 +249,7 @@
field: 'remark', field: 'remark',
title: '备注', title: '备注',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'voices', field: 'voices',
...@@ -313,7 +329,7 @@ ...@@ -313,7 +329,7 @@
field: 'code', field: 'code',
title: '操作', title: '操作',
width: 80, width: 80,
visible: (activeName.value === 'audit' || activeName.value === 'complete') ? true : false, visible: activeName.value === 'audit' || activeName.value === 'complete' ? true : false,
slots: { slots: {
default: ({ row, rowIndex }) => { default: ({ row, rowIndex }) => {
if (activeName.value === 'audit') { if (activeName.value === 'audit') {
...@@ -323,7 +339,7 @@ ...@@ -323,7 +339,7 @@
处理 处理
</ElButton> </ElButton>
</> </>
) );
} else { } else {
return ( return (
<> <>
...@@ -331,14 +347,14 @@ ...@@ -331,14 +347,14 @@
审核 审核
</ElButton> </ElButton>
</> </>
) );
} }
} },
} },
}, },
], ],
onCheckboxChange: onCheckboxChange onCheckboxChange: onCheckboxChange,
} };
}); });
const preview = (item, type) => { const preview = (item, type) => {
const list = []; const list = [];
...@@ -354,14 +370,14 @@ ...@@ -354,14 +370,14 @@
}; };
const audit = async (row) => { const audit = async (row) => {
const list = caseLRef.value.element.getCheckboxRecords(); const list = caseLRef.value.element.getCheckboxRecords();
if (!list.length) return if (!list.length) return;
await ElMessageBox.confirm('是否确认发起稽核勾选项?', '提示', { await ElMessageBox.confirm('是否确认发起稽核勾选项?', '提示', {
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning',
}); });
const ids = list.map((v) => v.id).join(','); const ids = list.map((v) => v.id).join(',');
await batchSave({ids: ids}); await batchSave({ ids: ids });
ElMessage({ ElMessage({
type: 'success', type: 'success',
......
...@@ -107,14 +107,14 @@ ...@@ -107,14 +107,14 @@
const config = reactive({ const config = reactive({
columns: [ columns: [
{ type: 'checkbox', title: '', width: 40 }, { type: 'checkbox', title: '', width: 40 },
{ field: 'caseId', title: '案件ID', search: { el: 'input' }, width: 80 }, { field: 'caseId', title: '案件ID', search: { el: 'input', labelWidth: 85 }, width: 80 },
{ {
field: 'arealist', field: 'arealist',
enum: citydata, enum: citydata,
title: '所属区域', title: '所属区域',
width: 80, width: 80,
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
search: { el: 'cascader', props: { clearable: true } }, search: { el: 'cascader', props: { clearable: true }, labelWidth: 85 },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
...@@ -131,20 +131,20 @@ ...@@ -131,20 +131,20 @@
field: 'loanPlatform.name', field: 'loanPlatform.name',
title: '借款机构', title: '借款机构',
width: 100, width: 100,
search: { el: 'input', props: { clearable: true }, key: 'payOrg' }, search: { el: 'input', props: { clearable: true }, key: 'payOrg', labelWidth: 85 },
}, },
{ {
field: 'manageOrg.orgName', field: 'manageOrg.orgName',
title: '资管公司', title: '资管公司',
width: 100, width: 100,
search: { el: 'input', props: { clearable: true }, key: 'manageOrg' }, search: { el: 'input', props: { clearable: true }, key: 'manageOrg', labelWidth: 85 },
}, },
{ {
field: 'distributeStatus', field: 'distributeStatus',
title: '分配状态', title: '分配状态',
width: 80, width: 80,
enum: distributeStatusOpt, enum: distributeStatusOpt,
search: { el: 'select', props: { filterable: true }, span: 1 }, search: { el: 'select', props: { filterable: true }, labelWidth: 85 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
...@@ -162,7 +162,7 @@ ...@@ -162,7 +162,7 @@
field: 'tenant.name', field: 'tenant.name',
title: '调解中心', title: '调解中心',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'discount', field: 'discount',
...@@ -173,50 +173,58 @@ ...@@ -173,50 +173,58 @@
field: 'cpe.name', field: 'cpe.name',
title: 'CPE', title: 'CPE',
width: 60, width: 60,
search: { el: 'input', props: { clearable: true }, key: 'cpeName' }, search: { el: 'input', props: { clearable: true }, key: 'cpeName', labelWidth: 85 },
}, },
{ {
field: 'tenantTime', field: 'tenantTime',
title: '分配中心日期', title: '分配中心日期',
width: 100, width: 100,
search: { el: 'date-picker', props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' } }, search: {
el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 85,
},
}, },
{ {
field: 'commissionAmount', field: 'commissionAmount',
title: '债权总额', title: '债权总额',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'cpeDate', field: 'cpeDate',
title: '分配CPE日期', title: '分配CPE日期',
width: 100, width: 100,
search: { el: 'date-picker', props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' } }, search: {
el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 85,
},
}, },
{ {
field: 'borrower.name', field: 'borrower.name',
title: '借款人姓名', title: '借款人姓名',
width: 100, width: 100,
search: { el: 'input', key: 'borrowerName', props: { clearable: true } }, search: { el: 'input', key: 'borrowerName', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'sumRepayAmount', field: 'sumRepayAmount',
title: '已还总额', title: '已还总额',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'borrower.idCard', field: 'borrower.idCard',
title: '身份证', title: '身份证',
width: 120, width: 120,
search: { el: 'input', props: { clearable: true }, key: 'idCard' }, search: { el: 'input', props: { clearable: true }, key: 'idCard', labelWidth: 85 },
}, },
{ {
field: 'borrower.phone', field: 'borrower.phone',
key: 'borrowerPhone', key: 'borrowerPhone',
title: '手机', title: '手机',
width: 100, width: 100,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'principalBalance', field: 'principalBalance',
......
...@@ -433,26 +433,28 @@ ...@@ -433,26 +433,28 @@
currentInfo.value = info; currentInfo.value = info;
currentDetail.value = detail; currentDetail.value = detail;
console.log('currentInfo', currentInfo.value, currentDetail.value); console.log('currentInfo', currentInfo.value, currentDetail.value);
form.sum = 0 form.sum = 0;
form.phoneResultStatus = '' form.phoneResultStatus = '';
form.remark = '' form.remark = '';
form.nextTime = null form.nextTime = null;
form.trackTime = dayjs().format('YYYY-MM-DD HH:mm:ss') form.trackTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
form.images = [] form.images = [];
form.notes = [] form.notes = [];
form.others = [] form.others = [];
form.voices = [] form.voices = [];
resuleObj.label = '本人可联' resuleObj.label = '本人可联';
resuleObj.childrenlabel = null resuleObj.childrenlabel = null;
tabledata.value = caselist; tabledata.value = caselist;
}; };
const submitForm = () => { const submitForm = () => {
if (!form.phoneResultStatus) return ElMessage.warning({ if (!form.phoneResultStatus)
message: '跟进状态必选' return ElMessage.warning({
}); message: '跟进状态必选',
if (!resuleObj.childrenlabel) return ElMessage.warning({ });
message: '跟进结果必选' if (!resuleObj.childrenlabel)
}); return ElMessage.warning({
message: '跟进结果必选',
});
saveTrackRecord({ saveTrackRecord({
loans: tabledata.value, loans: tabledata.value,
guarantor: currentInfo.value, guarantor: currentInfo.value,
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<el-button type="primary" @click="reduce">减免申请</el-button> <el-button type="primary" @click="reduce">减免申请</el-button>
<el-button type="primary" @click="split">分期申请</el-button> <el-button type="primary" @click="split">分期申请</el-button>
</div> </div>
<div class="detail-steps" style="display:none;"> <div class="detail-steps" style="display: none">
<el-steps :active="activeStep"> <el-steps :active="activeStep">
<el-step <el-step
:title="item.title" :title="item.title"
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
getByStages, getByStages,
listByBorrower, listByBorrower,
getRepayRecords, getRepayRecords,
getGuarantors getGuarantors,
} from '@/api/property'; } from '@/api/property';
import { Picture, Download } from '@element-plus/icons-vue'; import { Picture, Download } from '@element-plus/icons-vue';
import { saveAudit } from '@/api/audit'; import { saveAudit } from '@/api/audit';
...@@ -481,7 +481,7 @@ ...@@ -481,7 +481,7 @@
} }
}, },
}, },
} },
], ],
toolbarConfig: { enabled: false }, toolbarConfig: { enabled: false },
}); });
...@@ -768,12 +768,10 @@ ...@@ -768,12 +768,10 @@
const audit = (row) => { const audit = (row) => {
saveAudit({ saveAudit({
trackRecord: { trackRecord: {
id: row.id id: row.id,
} },
}).then(res => { }).then((res) => {});
};
})
}
const reduceConfig = reactive({ const reduceConfig = reactive({
columns: [ columns: [
{ {
...@@ -887,10 +885,10 @@ ...@@ -887,10 +885,10 @@
onBeforeMount(async () => { onBeforeMount(async () => {
const id = JSON.parse(route.query.id); const id = JSON.parse(route.query.id);
const { result } = await getCredit(id); const { result } = await getCredit(id);
console.log('result', result) console.log('result', result);
detail.value = result; detail.value = result;
if (14) { if (14) {
getGuarantorsList(14) getGuarantorsList(14);
getTrackRecordList(14); getTrackRecordList(14);
listByBorrower(14).then((res) => { listByBorrower(14).then((res) => {
if (res.result && res.result) { if (res.result && res.result) {
......
<template> <template>
<div class="card content-box"> <div class="table-box">
<div class="table-inner"> <div class="table-inner">
<ProTable :config="config" ref="caseLRef" :api="getCreditPage"> <ProTable :config="config" ref="caseLRef" :api="getCreditPage">
<!-- <ProTable :config="config" ref="caseLRef" :data="data"> --> <!-- <ProTable :config="config" ref="caseLRef" :data="data"> -->
...@@ -73,18 +73,18 @@ ...@@ -73,18 +73,18 @@
]; ];
const config = reactive({ const config = reactive({
columns: [ columns: [
{ field: 'caseId', title: '案件ID', search: { el: 'input' }, width: 80 }, { field: 'caseId', title: '案件ID', search: { el: 'input', labelWidth: 85 }, width: 80 },
{ {
field: 'loanPlatform.name', field: 'loanPlatform.name',
title: '借款机构', title: '借款机构',
width: 100, width: 100,
search: { el: 'input', props: { clearable: true }, key: 'payOrg' }, search: { el: 'input', props: { clearable: true }, key: 'payOrg', labelWidth: 85 },
}, },
{ {
field: 'manageOrg.orgName', field: 'manageOrg.orgName',
title: '资管公司', title: '资管公司',
width: 100, width: 100,
search: { el: 'input', props: { clearable: true }, key: 'manageOrg' }, search: { el: 'input', props: { clearable: true }, key: 'manageOrg', labelWidth: 85 },
}, },
{ {
field: 'borrower.name', field: 'borrower.name',
...@@ -94,6 +94,7 @@ ...@@ -94,6 +94,7 @@
el: 'input', el: 'input',
key: 'borrowerName', key: 'borrowerName',
props: { clearable: true }, props: { clearable: true },
labelWidth: 85,
}, },
}, },
{ {
...@@ -104,6 +105,7 @@ ...@@ -104,6 +105,7 @@
el: 'input', el: 'input',
props: { clearable: true }, props: { clearable: true },
key: 'borrowerIdCard', key: 'borrowerIdCard',
labelWidth: 85,
}, },
}, },
{ {
...@@ -114,6 +116,7 @@ ...@@ -114,6 +116,7 @@
el: 'input', el: 'input',
props: { clearable: true }, props: { clearable: true },
key: 'borrowerPhone', key: 'borrowerPhone',
labelWidth: 85,
}, },
}, },
{ {
...@@ -125,63 +128,67 @@ ...@@ -125,63 +128,67 @@
field: 'commissionAmount', field: 'commissionAmount',
title: '委案金额', title: '委案金额',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'sumRepayAmount', field: 'sumRepayAmount',
title: '累计还款金额', title: '累计还款金额',
width: 110, width: 100,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'sumReductionAmount', field: 'sumReductionAmount',
title: '累计减免金额', title: '累计减免金额',
width: 110, width: 100,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'remainingAmount', field: 'remainingAmount',
title: '剩余待还金额', title: '剩余待还金额',
width: 110, width: 100,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'cpe.username', field: 'cpe.username',
title: 'CPE', title: 'CPE',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true }, key: 'cpeName' }, search: { el: 'input', props: { clearable: true }, key: 'cpeName', labelWidth: 85 },
}, },
{ {
field: 'cpeDate', field: 'cpeDate',
title: '分配CPE日期', title: '分配CPE日期',
width: 110, width: 100,
search: { el: 'date-picker', props: { type: 'date', valueFormat: 'YYYY-MM-DD' } }, search: {
el: 'date-picker',
props: { type: 'date', valueFormat: 'YYYY-MM-DD' },
labelWidth: 85,
},
}, },
{ {
field: 'principalBalance', field: 'principalBalance',
title: '本金余额', title: '本金余额',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'debitInterest', field: 'debitInterest',
title: '欠息额', title: '欠息额',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'commission', field: 'commission',
title: '手续费', title: '手续费',
width: 80, width: 80,
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true }, labelWidth: 85 },
}, },
{ {
field: 'followStatus', field: 'followStatus',
title: '跟进结果', title: '跟进结果',
width: 80, width: 80,
enum: followStatusOpt, enum: followStatusOpt,
search: { el: 'select', props: { filterable: true }, span: 1 }, search: { el: 'select', props: { filterable: true }, labelWidth: 85 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
...@@ -200,7 +207,7 @@ ...@@ -200,7 +207,7 @@
title: '跟进状态', title: '跟进状态',
width: 80, width: 80,
enum: phoneResultStatusOpt, enum: phoneResultStatusOpt,
search: { el: 'select', props: { filterable: true }, span: 1 }, search: { el: 'select', props: { filterable: true }, labelWidth: 85 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
...@@ -219,15 +226,13 @@ ...@@ -219,15 +226,13 @@
title: '案件状态', title: '案件状态',
width: 80, width: 80,
enum: caseStatusOpt, enum: caseStatusOpt,
search: { el: 'select', props: { filterable: true }, span: 1 }, search: { el: 'select', props: { filterable: true }, labelWidth: 85 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
<> <>
{row.caseStatus {row.caseStatus ? caseStatusOpt.find((v) => v.value === row.caseStatus).label : ''}
? caseStatusOpt.find((v) => v.value === row.caseStatus).label
: ''}
</> </>
); );
}, },
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
> >
</div> </div>
</div> </div>
<div class="flex-1 importwrapper"> <div class="flex-1 importwrapper">
<div class="mb-1 text-center">3、上传数据</div> <div class="mb-1 text-center">3、上传数据</div>
<div class="pr-4"> <div class="pr-4">
<el-form ref="formRef" inline :model="form" :rules="rules" label-width="85px"> <el-form ref="formRef" inline :model="form" :rules="rules" label-width="85px">
...@@ -136,18 +136,18 @@ ...@@ -136,18 +136,18 @@
{ {
field: 'code', field: 'code',
title: '导入编号', title: '导入编号',
search: { el: 'input', span: 1.5, props: { clearable: true } }, search: { el: 'input', props: { clearable: true } },
}, },
{ {
field: 'contractNo', field: 'contractNo',
title: '委案合同', title: '委案合同',
search: { el: 'input', span: 1.5, props: { clearable: true } }, search: { el: 'input', props: { clearable: true } },
}, },
{ {
field: 'code', field: 'code',
title: '资产类型', title: '资产类型',
enum: options, enum: options,
search: { el: 'select', props: { filterable: true }, span: 1.5 }, search: { el: 'select', props: { filterable: true } },
fieldNames: { label: 'genderLabel', value: 'genderValue' }, fieldNames: { label: 'genderLabel', value: 'genderValue' },
}, },
{ {
...@@ -205,7 +205,6 @@ ...@@ -205,7 +205,6 @@
search: { search: {
el: 'date-picker', el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' }, props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
span: 1.5,
}, },
}, },
], ],
...@@ -290,10 +289,10 @@ ...@@ -290,10 +289,10 @@
uploadRef.value.clearFiles(); uploadRef.value.clearFiles();
form.path = ''; form.path = '';
query(); query();
form['path'] = '' form['path'] = '';
form['code'] = '' form['code'] = '';
form['contractNo'] = '' form['contractNo'] = '';
form['discount'] = '' form['discount'] = '';
}); });
}; };
onMounted(() => { onMounted(() => {
......
...@@ -28,17 +28,15 @@ ...@@ -28,17 +28,15 @@
{ type: 'checkbox', width: 50 }, { type: 'checkbox', width: 50 },
{ field: 'name', title: '调解中心名称', search: { el: 'input' } }, { field: 'name', title: '调解中心名称', search: { el: 'input' } },
{ field: 'code', title: '调解中心编码', search: { el: 'input' } }, { field: 'code', title: '调解中心编码', search: { el: 'input' } },
{ field: 'adminUser', title: '负责人'}, { field: 'adminUser', title: '负责人' },
{ field: 'phone', title: '负责人手机'}, { field: 'phone', title: '负责人手机' },
{ {
field: '', field: '',
title: '成员数量', title: '成员数量',
width: 80, width: 80,
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return <div>{row.users.length}</div>;
<div>{row.users.length}</div>
);
}, },
}, },
}, },
......
<template> <template>
<div class="table-box"> <div class="table-box">
<ProTable ref="proTable" :config="config" :api="pageMyMesage"> <ProTable ref="proTable" :config="config" :api="pageMyMesage"> </ProTable>
</ProTable>
</div> </div>
</template> </template>
...@@ -13,22 +12,22 @@ ...@@ -13,22 +12,22 @@
import { pageMyMesage } from '@/api/message'; import { pageMyMesage } from '@/api/message';
const statusOpt = [ const statusOpt = [
{ label: '正常', value: 'normal' }, { label: '正常', value: 'normal' },
{ label: '已撤销', value: 'cancel' } { label: '已撤销', value: 'cancel' },
]; ];
const messageTypeOpt = [ const messageTypeOpt = [
{ label: '通知', value: 'system' }, { label: '通知', value: 'system' },
{ label: '任务消息', value: 'task' } { label: '任务消息', value: 'task' },
] ];
const sendTypeOpt = [ const sendTypeOpt = [
{ label: '群发', value: 'all' }, { label: '群发', value: 'all' },
{ label: '指定用户发送', value: 'user' }, { label: '指定用户发送', value: 'user' },
{ label: '指定角色发送', value: 'role' }, { label: '指定角色发送', value: 'role' },
{ label: '指定调节中心发送', value: 'tentant' }, { label: '指定调节中心发送', value: 'tentant' },
] ];
const serviceTypeOpt = [ const serviceTypeOpt = [
{ label: '流程', value: 'bpm' }, { label: '流程', value: 'bpm' },
{ label: '提示', value: 'tip' } { label: '提示', value: 'tip' },
] ];
const proTable = ref(); const proTable = ref();
const socketStore = useSocketStore(); const socketStore = useSocketStore();
const config = reactive({ const config = reactive({
...@@ -44,7 +43,7 @@ ...@@ -44,7 +43,7 @@
field: 'sender.username', field: 'sender.username',
title: '发送人名称', title: '发送人名称',
width: 160, width: 160,
search: { el: 'input', props: { clearable: true },key: 'senderName' }, search: { el: 'input', props: { clearable: true }, key: 'senderName' },
}, },
{ {
field: 'status', field: 'status',
...@@ -77,14 +76,14 @@ ...@@ -77,14 +76,14 @@
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
<> <>
{row.messageType {row.messageType
? messageTypeOpt.find((v) => v.value === row.messageType).label ? messageTypeOpt.find((v) => v.value === row.messageType).label
: ''} : ''}
</> </>
); );
}, },
}, },
}, },
{ {
...@@ -96,14 +95,10 @@ ...@@ -96,14 +95,10 @@
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
<> <>{row.sendType ? sendTypeOpt.find((v) => v.value === row.sendType).label : ''}</>
{row.sendType );
? sendTypeOpt.find((v) => v.value === row.sendType).label },
: ''}
</>
);
},
}, },
}, },
{ {
...@@ -115,22 +110,25 @@ ...@@ -115,22 +110,25 @@
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
<> <>
{row.serviceType {row.serviceType
? serviceTypeOpt.find((v) => v.value === row.serviceType).label ? serviceTypeOpt.find((v) => v.value === row.serviceType).label
: ''} : ''}
</> </>
); );
}, },
}, },
} },
], ],
}); });
const query = () => proTable.value?.search(); const query = () => proTable.value?.search();
watch(() => socketStore.msg, (newValue, oldValue) => { watch(
query() () => socketStore.msg,
}); (newValue, oldValue) => {
query();
}
);
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