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

修复管理和修复审批

parent e21e3df8
...@@ -84,3 +84,16 @@ export const saveTrackRecord = (data) => { ...@@ -84,3 +84,16 @@ 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 saveRepairRecord = (data) => {
return request.post('/RepairRecord/save', data);
};
// 联络人修复记录列表
export const getRepairRecord = (params) => {
return request.get('/RepairRecord/page', params);
};
// 修复记录批量审批
export const RepairRecordStatusByIds = (params) => {
return request.get('/RepairRecord/flowStatusByIds', params);
};
...@@ -11,3 +11,7 @@ export const getRolePage = (params) => { ...@@ -11,3 +11,7 @@ export const getRolePage = (params) => {
export const deleteRoles = (ids) => { export const deleteRoles = (ids) => {
return request.get('/role/batchDeleteByIds', { ids }); return request.get('/role/batchDeleteByIds', { ids });
}; };
export const getDefualtRoles = (params) => {
return request.get('/role/getDefualtRoles', params);
};
<template> <template>
<div class="table-box"> <div class="table-box">
<ProTable :config="config" :data="tabledata" :showPagination="false" :showToolBar="true"> <ProTable :config="config" ref="caseLRef" :api="getRepairRecord">
<template #left_buttons> <template #left_buttons>
<!-- <el-button type="primary">下载申请 </el-button> --> <!-- <el-button type="primary">下载申请 </el-button> -->
<el-button type="primary">审批 </el-button> <el-button
type="primary"
@click="changeStatus"
:disabled="!selectdList || selectdList.length > 1"
>审批
</el-button>
<!-- <el-button type="primary">下载 </el-button> <!-- <el-button type="primary">下载 </el-button>
<el-button type="primary">批量修复上传 </el-button> --> <el-button type="primary">批量修复上传 </el-button> -->
</template> </template>
</ProTable> </ProTable>
<vxe-modal
v-model="showModal"
title="审批提示"
height="282"
width="450"
show-footer
esc-closable
>
<div class="w-full px-3 h-full overflow-auto flex-col flex mytable">
是否审批通过选中的数据?
</div>
<template #footer>
<el-button type="default" @click="showModal = false">取消</el-button>
<el-button type="danger" @click="submitForm('fail')">不通过</el-button>
<el-button type="primary" @click="submitForm('pass')">通过</el-button>
</template>
</vxe-modal>
</div> </div>
</template> </template>
<script setup name="systemLog" lang="jsx"> <script setup name="systemLog" lang="jsx">
import { computed } from 'vue'; import { computed } from 'vue';
import { onMounted } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getRepairRecord, RepairRecordStatusByIds } from '@/api/property';
import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
const tabledata = ref([]); const tabledata = ref([]);
const config = computed(() => { const showModal = ref(false);
return { const caseLRef = ref();
columns: [ const flowStatusOpt = [
{ type: 'checkbox', width: 50 }, { label: '待审核', value: 'pending' },
{ type: 'seq', width: 50 }, // { label: '审核中', value: 'in_review' },
{ { label: '通过', value: 'pass' },
field: 'code', { label: '未通过', value: 'fail' }
title: '联系人姓名', ];
search: { el: 'input', props: { clearable: true } }, const selectdList = ref([]);
const onCheckboxChange = (row) => {
console.log('row', row);
selectdList.value = row.records;
};
const onCheckboxAll =(flag)=> {
if (flag.checked) {
selectdList.value = flag.records;
} else {
selectdList.value = [];
}
}
const changeStatus = async () => {
showModal.value = true;
};
const submitForm = async (type) => {
const ids = selectdList.value.map((v) => v.id).join(',');
await RepairRecordStatusByIds({
ids: ids,
flowStatus: type,
});
ElMessage.success({
message: '审核成功',
plain: true,
});
showModal.value = false;
query();
};
const config = reactive({
columns: [
{ type: 'checkbox', width: 50 },
{
field: 'borrower.name',
title: '借款人姓名',
showOverflow: 'tooltip',
width: 120,
// search: {
// el: 'input',
// key: 'name',
// props: { clearable: true },
// labelWidth: 95,
// },
},
{
field: 'borrower.idCard',
title: '借款人身份证',
showOverflow: 'tooltip',
width: 140,
// search: {
// el: 'input',
// props: { clearable: true },
// key: 'borrowerIdCard',
// labelWidth: 95,
// },
},
{
field: 'newName',
title: '联系人姓名',
showOverflow: 'tooltip',
width: 140,
search: {
el: 'input',
props: { clearable: true },
key: 'name',
labelWidth: 95,
},
},
{
field: 'oldPhone',
title: '修复前联系方式',
showOverflow: 'tooltip',
// width: 140,
search: {
el: 'input',
props: { clearable: true },
key: 'oldPhone',
labelWidth: 95,
}, },
{ },
field: 'code', {
title: '与债权人关系', field: 'newPhone',
search: { el: 'input', props: { clearable: true } }, title: '修复后联系方式',
showOverflow: 'tooltip',
// width: 140,
search: {
el: 'input',
props: { clearable: true },
key: 'newPhone',
labelWidth: 95,
}, },
{ },
field: 'code', {
title: '号码类型', field: 'kinship',
search: { el: 'input', props: { clearable: true } }, title: '与债权人关系',
showOverflow: 'tooltip',
// width: 140,
// search: {
// el: 'input',
// props: { clearable: true },
// key: 'newPhone',
// labelWidth: 95,
// },
},
{
field: 'flowStatus',
showOverflow: 'tooltip',
title: '审核状态',
width: 95,
enum: flowStatusOpt,
search: { el: 'select', props: { filterable: true }, labelWidth: 95 },
fieldNames: { label: 'label', value: 'value' },
slots: {
default: ({ row }) => {
return (
<>
{row.flowStatus
? flowStatusOpt.find((v) => v.value === row.flowStatus).label
: ''}
</>
);
},
}, },
], }
}; ],
onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll
});
const query = () => caseLRef.value?.search();
onMounted(() => {
query();
}); });
tabledata.value = [
{ name: 'admin', code: 'admin', role: 'superadmin', num: 1 },
{ name: 'account1', code: 'account1', role: 'user', num: 1 },
{ name: 'account2', code: 'account2', role: 'user', num: 1 },
{ name: 'account3', code: 'account3', role: 'user', num: 1 },
];
</script> </script>
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
import { ElMessageBox, ElMessage } from 'element-plus'; import { ElMessageBox, ElMessage } from 'element-plus';
import citydata from '../../../assets/citydata'; import citydata from '../../../assets/citydata';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import {VxeTextEllipsis, VxeTooltip} from 'vxe-pc-ui'
const allocationModalRef = ref(); const allocationModalRef = ref();
const caseLRef = ref(); const caseLRef = ref();
const selectdList = ref([]); const selectdList = ref([]);
...@@ -76,6 +77,11 @@ ...@@ -76,6 +77,11 @@
}); });
query(); query();
}; };
const caseStatusOpt = [
{ label: '正常', value: 'normal' },
{ label: '撤案', value: 'withdraw' },
{ label: '留案', value: 'stay' },
];
const paramCallback = (param) => { const paramCallback = (param) => {
const obj = JSON.parse(JSON.stringify(param)); const obj = JSON.parse(JSON.stringify(param));
if (obj.arealist && obj.arealist.length > 0) { if (obj.arealist && obj.arealist.length > 0) {
...@@ -126,17 +132,15 @@ ...@@ -126,17 +132,15 @@
enum: citydata, enum: citydata,
title: '所属区域', title: '所属区域',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 100, width: 160,
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
search: { el: 'cascader', props: { clearable: true, checkStrictly: true }, labelWidth: 78 }, search: { el: 'cascader', props: { clearable: true, checkStrictly: true }, labelWidth: 78 },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
<div> <VxeTooltip content={row.borrower.domicileProvince + (row.borrower.domicileCity ? '-' + row.borrower.domicileCity : '') + (row.borrower.area ? '-' + row.borrower.area : '')}>
{row.manageOrg.province} <VxeTextEllipsis content={row.borrower.domicileProvince + (row.borrower.domicileCity ? '-' + row.borrower.domicileCity : '') + (row.borrower.area ? '-' + row.borrower.area : '')}></VxeTextEllipsis>
{row.manageOrg.city ? '-' + row.manageOrg.city : ''} </VxeTooltip>
{row.manageOrg.district ? '-' + row.manageOrg.district : ''}
</div>
); );
}, },
}, },
...@@ -278,6 +282,24 @@ ...@@ -278,6 +282,24 @@
title: '违约金', title: '违约金',
width: 80, width: 80,
}, },
{
field: 'caseStatus',
title: '案件状态',
showOverflow: 'tooltip',
width: 80,
enum: caseStatusOpt,
search: { el: 'select', props: { filterable: true }, labelWidth: 80 },
fieldNames: { label: 'label', value: 'value' },
slots: {
default: ({ row }) => {
return (
<>
{row.caseStatus ? caseStatusOpt.find((v) => v.value === row.caseStatus).label : ''}
</>
);
},
},
}
], ],
onCheckboxChange: onCheckboxChange, onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll onCheckboxAll: onCheckboxAll
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
esc-closable esc-closable
> >
<div class="w-full px-3 h-full overflow-auto flex-col flex mytable"> <div class="w-full px-3 h-full overflow-auto flex-col flex mytable">
数据中有留案案件,请选择回收方式 回收是只回收未留案的案件,强制回收就是所有状态案件都处理,请确认选择操作?
</div> </div>
<template #footer> <template #footer>
<el-button type="default" @click="showModal = false">取消</el-button> <el-button type="default" @click="showModal = false">取消</el-button>
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
import { getLoantotal, getLoanpage, back, fullBack } from '@/api/allcation'; import { getLoantotal, getLoanpage, 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 citydata from '../../../assets/citydata'; import citydata from '../../../assets/citydata';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
const caseLRef = ref(); const caseLRef = ref();
...@@ -53,7 +54,30 @@ ...@@ -53,7 +54,30 @@
} }
}); });
}; };
const caseStatusOpt = [
{ label: '正常', value: 'normal' },
{ label: '撤案', value: 'withdraw' },
{ label: '留案', value: 'stay' },
];
const backCase = async () => { const backCase = async () => {
// 勾选的情况
// if (selectdList.value && selectdList.value.length) {
// const arr = selectdList.value.filter(v => v.caseStatus === 'stay')
// if (arr.length > 0) {
// showModal.value = true
// } else {
// submitForm('withdraw')
// }
// } else {
// const param = {...curParam.value, caseStatus: 'stay'}
// getLoanpage(param).then(res=>{
// if(res.success && res.result && res.result.content && res.result.content.length) {
// showModal.value = true
// } else {
// submitForm('withdraw')
// }
// })
// }
showModal.value = true showModal.value = true
}; };
const submitForm = async (type) => { const submitForm = async (type) => {
...@@ -117,6 +141,7 @@ ...@@ -117,6 +141,7 @@
selectdList.value = []; selectdList.value = [];
} }
} }
console.log('citydatacitydata', citydata); console.log('citydatacitydata', citydata);
const config = reactive({ const config = reactive({
columns: [ columns: [
...@@ -139,11 +164,9 @@ ...@@ -139,11 +164,9 @@
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
<div> <VxeTooltip content={row.borrower.domicileProvince + (row.borrower.domicileCity ? '-' + row.borrower.domicileCity : '') + (row.borrower.area ? '-' + row.borrower.area : '')}>
{row.manageOrg.province} <VxeTextEllipsis content={row.borrower.domicileProvince + (row.borrower.domicileCity ? '-' + row.borrower.domicileCity : '') + (row.borrower.area ? '-' + row.borrower.area : '')}></VxeTextEllipsis>
{row.manageOrg.city ? '-' + row.manageOrg.city : ''} </VxeTooltip>
{row.manageOrg.district ? '-' + row.manageOrg.district : ''}
</div>
); );
}, },
}, },
...@@ -285,6 +308,24 @@ ...@@ -285,6 +308,24 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
}, },
{
field: 'caseStatus',
title: '案件状态',
showOverflow: 'tooltip',
width: 80,
enum: caseStatusOpt,
search: { el: 'select', props: { filterable: true }, labelWidth: 80 },
fieldNames: { label: 'label', value: 'value' },
slots: {
default: ({ row }) => {
return (
<>
{row.caseStatus ? caseStatusOpt.find((v) => v.value === row.caseStatus).label : ''}
</>
);
},
},
}
], ],
onCheckboxChange: onCheckboxChange, onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll onCheckboxAll: onCheckboxAll
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
v-model="showModal" v-model="showModal"
title="修复申请" title="修复申请"
@hide="onHide" @hide="onHide"
height="582" height="350"
width="1003" width="800"
show-footer show-footer
esc-closable esc-closable
> >
...@@ -23,16 +23,16 @@ ...@@ -23,16 +23,16 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-form-item class="w-full" label="联系人姓名:" prop="name"> <el-form-item class="w-full" label="联系人姓名:" prop="newName">
<el-input v-model="form.name" placeholder="请输入账号" /> <el-input v-model="form.newName" placeholder="请输入联系人姓名" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item class="w-full" label="号码类型:" prop="role"> 修复 </el-form-item> <el-form-item class="w-full" label="号码类型:" prop="role"> 修复 </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-form-item class="w-full" label="与案人关系:" prop="relation"> <el-form-item class="w-full" label="与案人关系:" prop="kinship">
<el-select v-model="form.relation" placeholder="请选择"> <el-select v-model="form.kinship" placeholder="请选择关系">
<el-option <el-option
v-for="item in options" v-for="item in options"
:key="item.value" :key="item.value"
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item class="w-full" label="修复前联系号码:" prop="role" label-width="140px"> <el-form-item class="w-full" label="修复前联系号码:" prop="role" label-width="140px">
{{ currentDetail.people }} {{ currentDetail?.borrower?.phone }}
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
...@@ -59,6 +59,9 @@ ...@@ -59,6 +59,9 @@
<script setup lang="jsx" name="allocationModal"> <script setup lang="jsx" name="allocationModal">
import { computed } from 'vue'; import { computed } from 'vue';
import { saveRepairRecord } from '@/api/property';
import { ElMessage } from 'element-plus';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
const data = ref([]); const data = ref([]);
const mytransfer = ref(); const mytransfer = ref();
...@@ -67,40 +70,49 @@ ...@@ -67,40 +70,49 @@
const showModal = ref(false); const showModal = ref(false);
const currentDetail = ref({ people: 0, case: 0, money: 0 }); const currentDetail = ref({ people: 0, case: 0, money: 0 });
const form = reactive({ const form = reactive({
name: '', newName: '',
relation: '', kinship: '',
}); });
const onHide = () => { const onHide = () => {
currentDetail.value = { people: 0, case: 0, money: 0 }; currentDetail.value = { people: 0, case: 0, money: 0 };
}; };
const openModal = (account) => { const openModal = (account) => {
console.log('currentDetail', currentDetail.value)
showModal.value = true; showModal.value = true;
currentDetail.value = { people: 333, case: 44, money: 1111 }; currentDetail.value = account;
}; };
const submitForm = () => {}; const submitForm = () => {
saveRepairRecord({
"borrower": currentDetail.value?.borrower,
"oldName": "",
"newName": form.newName,
"oldPhone": [],
"newPhone": [],
"kinship": form.kinship,
"flowStatus": "pending",
"status": "Y",
"tenantId": 0
}).then(res => {
console.log('sadas', res)
if (res.success) {
ElMessage.success({
message: '保存成功',
});
showModal.value = false;
}
})
};
const options = [ const options = [
{ {
value: 'Option1', value: '本人',
label: 'Option1', label: '本人',
}, },
{ {
value: 'Option2', value: '非本人',
label: 'Option2', label: '非本人',
}, }
{
value: 'Option3',
label: 'Option3',
},
{
value: 'Option4',
label: 'Option4',
},
{
value: 'Option5',
label: 'Option5',
},
]; ];
const config = computed(() => { const config = computed(() => {
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
esc-closable esc-closable
> >
<div class="w-full px-3 h-full overflow-auto flex-col flex mytable"> <div class="w-full px-3 h-full overflow-auto flex-col flex mytable">
数据中有留案案件,请选择撤案方式 回收是只回收未留案的案件,强制回收就是所有状态案件都处理,请确认选择操作
</div> </div>
<template #footer> <template #footer>
<el-button type="default" @click="showModal = false">取消</el-button> <el-button type="default" @click="showModal = false">取消</el-button>
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
import { ElMessageBox, ElMessage } from 'element-plus'; import { ElMessageBox, ElMessage } from 'element-plus';
import citydata from '../../../assets/citydata'; import citydata from '../../../assets/citydata';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import {VxeTextEllipsis, VxeTooltip} from 'vxe-pc-ui'
const caseLRef = ref(); const caseLRef = ref();
const selectdList = ref([]); const selectdList = ref([]);
const curParam = ref({}); const curParam = ref({});
...@@ -54,9 +55,6 @@ ...@@ -54,9 +55,6 @@
} }
}); });
}; };
const backCase = async () => {
showModal.value = true
};
const submitForm = async (type) => { const submitForm = async (type) => {
const ids = selectdList.value.map((v) => v.id).join(','); const ids = selectdList.value.map((v) => v.id).join(',');
let param = { let param = {
...@@ -106,6 +104,32 @@ ...@@ -106,6 +104,32 @@
// getStatisis(obj); // getStatisis(obj);
return obj; return obj;
}; };
const caseStatusOpt = [
{ label: '正常', value: 'normal' },
{ label: '撤案', value: 'withdraw' },
{ label: '留案', value: 'stay' },
];
const backCase = async () => {
// 勾选的情况
// if (selectdList.value && selectdList.value.length) {
// const arr = selectdList.value.filter(v => v.caseStatus === 'stay')
// if (arr.length > 0) {
// showModal.value = true
// } else {
// submitForm('withdraw')
// }
// } else {
// const param = {...curParam.value, caseStatus: 'stay'}
// getLoanpage(param).then(res=>{
// if(res.success && res.result && res.result.content && res.result.content.length) {
// showModal.value = true
// } else {
// submitForm('withdraw')
// }
// })
// }
showModal.value = true
};
const distributeStatusOpt = [ const distributeStatusOpt = [
{ label: '未分派', value: 'undistributed' }, { label: '未分派', value: 'undistributed' },
{ label: '分派到调解中心', value: 'tenant' }, { label: '分派到调解中心', value: 'tenant' },
...@@ -140,11 +164,9 @@ ...@@ -140,11 +164,9 @@
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return ( return (
<div> <VxeTooltip content={row.borrower.domicileProvince + (row.borrower.domicileCity ? '-' + row.borrower.domicileCity : '') + (row.borrower.area ? '-' + row.borrower.area : '')}>
{row.manageOrg.province} <VxeTextEllipsis content={row.borrower.domicileProvince + (row.borrower.domicileCity ? '-' + row.borrower.domicileCity : '') + (row.borrower.area ? '-' + row.borrower.area : '')}></VxeTextEllipsis>
{row.manageOrg.city ? '-' + row.manageOrg.city : ''} </VxeTooltip>
{row.manageOrg.district ? '-' + row.manageOrg.district : ''}
</div>
); );
}, },
}, },
...@@ -286,6 +308,24 @@ ...@@ -286,6 +308,24 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
}, },
{
field: 'caseStatus',
title: '案件状态',
showOverflow: 'tooltip',
width: 80,
enum: caseStatusOpt,
search: { el: 'select', props: { filterable: true }, labelWidth: 80 },
fieldNames: { label: 'label', value: 'value' },
slots: {
default: ({ row }) => {
return (
<>
{row.caseStatus ? caseStatusOpt.find((v) => v.value === row.caseStatus).label : ''}
</>
);
},
},
}
], ],
onCheckboxChange: onCheckboxChange, onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll onCheckboxAll: onCheckboxAll
......
<template> <template>
<div class="table-box"> <div class="table-box">
<div class="card flex mb-2"> <div class="card flex mb-2" style="padding-top: 0">
<div class="flex-1 pr-3"> <div class="flex-1">
<div class="mb-1">1、上传文件</div> <div class="mb-1 text-center step">
<div> <div class="xuhao">1</div>
<el-upload 上传文件
class="avatar-uploader" <div class="jt"><el-icon size="60" color="#e3e3e3d9"><ArrowRight /></el-icon></div>
ref="uploadRef" </div>
:action="upload.url" <div class="w-full flex items-center justify-center pt-5">
:disabled="upload.isUploading" <div>
accept=".xls, .xlsx" <el-upload
:limit="1" class="avatar-uploader"
:on-success="handleFileSuccess" ref="uploadRef"
:on-remove="handleRemove" :action="upload.url"
:auto-upload="true" :disabled="upload.isUploading"
:on-progress="uploadVideoProcess" accept=".xls, .xlsx"
> :limit="1"
<el-button type="primary" plain :icon="Upload">上传文件</el-button> :on-success="handleFileSuccess"
</el-upload> :on-remove="handleRemove"
<!-- 进度条 --> :auto-upload="true"
<!-- <el-progress v-if="progressFlag" :percentage="loadProgress" /> --> :on-progress="uploadVideoProcess"
<div class="mt-2 text-xs text-gray-400"> 仅支持1个文件上传,格式为xls和xlsx </div> >
<div class="mt-1 text-blue-500 underline cursor-pointer" @click="downloadtemplate" <el-button type="primary" plain :icon="Upload">上传文件</el-button>
>下载模板</div </el-upload>
> <!-- 进度条 -->
<!-- <el-progress v-if="progressFlag" :percentage="loadProgress" /> -->
<div class="mt-2 text-xs text-gray-400"> 仅支持1个文件上传,格式为xls和xlsx </div>
<div class="mt-1 text-blue-500 underline cursor-pointer" @click="downloadtemplate"
>下载模板</div
>
</div>
</div> </div>
</div> </div>
<div class="flex-1"> <div class="flex-1">
<div class="mb-1">2、检查数据</div> <div class="mb-1 text-center step">
<div> <div class="xuhao">2</div>
<div class="flex items-center"> 检查数据
<el-button type="danger" @click="checkData" :disabled="!form.path">检查</el-button> <div class="jt"><el-icon size="60" color="#e3e3e3d9"><ArrowRight /></el-icon></div>
<span class="ml-2"> </div>
<div class="w-full flex items-center justify-center pt-5">
<div>
<div class="flex items-center">
<el-button type="danger" @click="checkData" :disabled="!form.path">检查</el-button>
</div>
<div class="text-sm mt-2">
<span class="mr-2 text-gray-400">通过{{ checkObj?.result?.success || 0 }}</span> <span class="mr-2 text-gray-400">通过{{ checkObj?.result?.success || 0 }}</span>
<span class="text-gray-400">失败{{ checkObj?.result?.error || 0 }}</span> <span class="text-gray-400">失败{{ checkObj?.result?.error || 0 }}</span>
</span> </div>
<!-- 进度条 -->
<!-- <el-progress v-if="progressFlag" :percentage="loadProgress" /> -->
<div
class="mt-2 text-xs text-blue-500 underline cursor-pointer"
v-if="checkObj.check"
@click="openError"
>下载检查结果</div
>
<div v-else class="mt-2 text-xs text-red-500"> *检查文件后才可以提交 </div>
</div> </div>
<!-- 进度条 -->
<!-- <el-progress v-if="progressFlag" :percentage="loadProgress" /> -->
<div
class="mt-2 text-xs text-blue-500 underline cursor-pointer"
v-if="checkObj.check"
@click="openError"
>下载检查结果</div
>
<div v-else class="mt-2 text-xs text-red-500"> *检查文件后才可以提交 </div>
</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 step">
<div class="pr-4"> <div class="xuhao">3</div>
<el-form ref="formRef" inline :model="form" :rules="rules" label-width="85px"> 上传数据
<el-form-item class="w-full" label="导入编号:" prop="code"> </div>
<el-input v-model="form.code" placeholder="请输入" style="width: 100%" /> <div class="w-full flex items-center justify-center pt-5">
</el-form-item> <div class="px-7">
<!-- <el-form-item class="w-full" label="委案合同:" prop="contractNo"> <el-form ref="formRef" inline :model="form" :rules="rules" label-width="85px">
<el-input v-model="form.contractNo" placeholder="请输入" style="width: 100%" /> <el-form-item class="w-full" label="导入编号:" prop="code">
</el-form-item> --> <el-input v-model="form.code" placeholder="请输入" style="width: 100%" />
<el-form-item class="w-full" label="折扣:" prop="discount"> </el-form-item>
<el-input v-model="form.discount" placeholder="请输入" style="width: 100%" /> <!-- <el-form-item class="w-full" label="委案合同:" prop="contractNo">
</el-form-item> <el-input v-model="form.contractNo" placeholder="请输入" style="width: 100%" />
</el-form> </el-form-item> -->
<el-button <el-form-item class="w-full" label="折扣:" prop="discount">
type="primary" <el-input v-model="form.discount" placeholder="请输入" style="width: 100%" />
@click="submitData" </el-form-item>
:disabled="!form.path || !checkObj.checksuccess" </el-form>
>上传</el-button <div class="flex justify-end">
> <el-button
type="primary"
@click="submitData"
:disabled="!form.path || !checkObj.checksuccess"
>上传</el-button
>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -96,7 +116,7 @@ ...@@ -96,7 +116,7 @@
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { computed, onMounted } from 'vue'; import { computed, onMounted } from 'vue';
import { ElButton, ElMessage } from 'element-plus'; import { ElButton, ElMessage } from 'element-plus';
import { Upload } from '@element-plus/icons-vue'; import { Upload,ArrowRight } from '@element-plus/icons-vue';
import { inject } from 'vue'; import { inject } from 'vue';
import { LoanSubmit, importLoanPage, checkLoanExcel} from '@/api/import'; import { LoanSubmit, importLoanPage, checkLoanExcel} from '@/api/import';
...@@ -317,4 +337,29 @@ ...@@ -317,4 +337,29 @@
margin-bottom: 3px !important; margin-bottom: 3px !important;
} }
} }
.xuhao {
background-image: url('./step.svg');
background-repeat:no-repeat;
background-size:100% 100%;
-moz-background-size:100% 100%;
width: 30px;
line-height: 30px;
margin-right: 5px;
height: 30px;
}
.step {
border-bottom: 1px solid #e3e3e3;
height: 45px;
display: flex;
position: relative;
width: 100%;
align-items: center;
justify-content: center;
line-height: 45px;
}
.jt {
position: absolute;
top: -7px;
right: 0;
}
</style> </style>
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739003172297" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11330" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512.164608 112a400.0256 400.0256 0 1 0 400.4352 400.0256A400.2048 400.2048 0 0 0 512.164608 112z m0 741.2224a341.1968 341.1968 0 1 1 341.5296-341.1968 341.376 341.376 0 0 1-341.5296 341.1968z" fill="#1296db" p-id="11331"></path><path d="M511.345408 1024A512 512 0 0 1 264.177408 64a5.888 5.888 0 1 1 5.6832 10.24A501.76 501.76 0 0 0 45.067008 691.2a499.6864 499.6864 0 0 0 645.888 287.4624 5.888 5.888 0 0 1 4.1984 10.9824A511.232 511.232 0 0 1 511.345408 1024z" fill="#1296db" p-id="11332"></path><path d="M781.425408 946.5856a5.8624 5.8624 0 0 1-3.1232-10.8544 499.9936 499.9936 0 0 0-444.8256-890.368 5.888 5.888 0 0 1-4.1984-10.9824 511.7696 511.7696 0 0 1 455.168 911.3088 5.8112 5.8112 0 0 1-3.0208 0.896z" fill="#1296db" p-id="11333"></path><path d="M311.998208 76.7232a23.5264 23.5264 0 1 1 23.5264-23.5264 23.552 23.552 0 0 1-23.5264 23.5264z m0-35.2768a11.7504 11.7504 0 1 0 11.7504 11.7504 11.776 11.776 0 0 0-11.7504-11.7504z" fill="#1296db" p-id="11334"></path><path d="M712.305408 994.3296a23.5264 23.5264 0 1 1 23.5264-23.5264 23.552 23.552 0 0 1-23.5264 23.5264z m0-35.2768a11.7504 11.7504 0 1 0 11.7504 11.7504 11.776 11.776 0 0 0-11.7504-11.7504z" fill="#1296db" p-id="11335"></path></svg>
\ No newline at end of file
<template> <template>
<div class="card content-box"> <div class="table-box">
<span class="text"> 修复管理 🍓🍇🍈🍉</span> <div class="table-inner">
<ProTable :config="config" ref="caseLRef" :api="getRepairRecord">
<!-- <ProTable :config="config" ref="caseLRef" :data="data"> -->
<!-- <template #table_top>
<div class="topgrp">
<div class="topbox">
<div class="topinner">
<p>统计值</p>
<p>111</p>
</div>
</div>
</div>
</template> -->
</ProTable>
</div>
</div> </div>
</template> </template>
<script setup name="systemLog"></script> <script setup name="case-manage" lang="jsx">
import { useRouter } from 'vue-router';
import { reactive, ref } from 'vue';
import { getRepairRecord } from '@/api/property';
const caseLRef = ref();
import { onMounted } from 'vue';
const router = useRouter();
const onCellClick = (row) => {
router.push({
path: '/property/case-detail',
query: { id: row.id }, //这里不能直接写成 query: JSON.stringify(item)
});
};
const flowStatusOpt = [
{ label: '待审核', value: 'pending' },
// { label: '审核中', value: 'in_review' },
{ label: '通过', value: 'pass' },
{ label: '未通过', value: 'fail' }
];
const config = reactive({
columns: [
{
field: 'borrower.name',
title: '借款人姓名',
showOverflow: 'tooltip',
width: 120,
// search: {
// el: 'input',
// key: 'name',
// props: { clearable: true },
// labelWidth: 95,
// },
},
{
field: 'borrower.idCard',
title: '借款人身份证',
showOverflow: 'tooltip',
width: 140,
// search: {
// el: 'input',
// props: { clearable: true },
// key: 'borrowerIdCard',
// labelWidth: 95,
// },
},
{
field: 'newName',
title: '联系人姓名',
showOverflow: 'tooltip',
width: 140,
search: {
el: 'input',
props: { clearable: true },
key: 'name',
labelWidth: 95,
},
},
{
field: 'oldPhone',
title: '修复前联系方式',
showOverflow: 'tooltip',
// width: 140,
search: {
el: 'input',
props: { clearable: true },
key: 'oldPhone',
labelWidth: 95,
},
},
{
field: 'newPhone',
title: '修复后联系方式',
showOverflow: 'tooltip',
// width: 140,
search: {
el: 'input',
props: { clearable: true },
key: 'newPhone',
labelWidth: 95,
},
},
{
field: 'kinship',
title: '与债权人关系',
showOverflow: 'tooltip',
// width: 140,
// search: {
// el: 'input',
// props: { clearable: true },
// key: 'newPhone',
// labelWidth: 95,
// },
},
{
field: 'flowStatus',
showOverflow: 'tooltip',
title: '审核状态',
width: 95,
enum: flowStatusOpt,
search: { el: 'select', props: { filterable: true }, labelWidth: 95 },
fieldNames: { label: 'label', value: 'value' },
slots: {
default: ({ row }) => {
return (
<>
{row.flowStatus
? flowStatusOpt.find((v) => v.value === row.flowStatus).label
: ''}
</>
);
},
},
}
],
});
const query = () => caseLRef.value?.search();
onMounted(() => {
query();
});
</script>
<style lang="scss" scoped>
.table-inner {
width: 100%;
:deep(.topgrp) {
display: flex;
margin-bottom: 8px;
.topbox {
margin-right: 10px;
background: rgba(0, 0, 0, 0.02);
border-radius: 16px;
width: 146px;
height: 97px;
display: flex;
justify-content: center;
align-items: center;
font-size: 24px;
p:nth-child(1) {
font-size: 14px;
color: rgba(0, 0, 0, 0.45);
}
}
}
}
</style>
...@@ -24,6 +24,23 @@ ...@@ -24,6 +24,23 @@
<el-input v-model="form.nickName" placeholder="请输入昵称" /> <el-input v-model="form.nickName" placeholder="请输入昵称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item class="w-full" label="角色" prop="roles">
<el-select
v-model="form.roles"
multiple
collapse-tags
placeholder="请选择角色"
>
<el-option
v-for="item in options"
:key="item.roleCode"
:label="item.roleName"
:value="item.roleCode"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item class="w-full" label="手机号" prop="phone"> <el-form-item class="w-full" label="手机号" prop="phone">
<el-input v-model="form.phone" placeholder="请输入手机号" /> <el-input v-model="form.phone" placeholder="请输入手机号" />
...@@ -51,6 +68,7 @@ ...@@ -51,6 +68,7 @@
import { computed } from 'vue'; import { computed } from 'vue';
import { ref } from 'vue'; import { ref } from 'vue';
import { saveUser } from '@/api/user'; import { saveUser } from '@/api/user';
import { getDefualtRoles } from '@/api/role';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
const emits = defineEmits(['success']); const emits = defineEmits(['success']);
...@@ -59,14 +77,30 @@ ...@@ -59,14 +77,30 @@
const loading = ref(false); const loading = ref(false);
const form = ref({ const form = ref({
username: '', username: '',
roles: [],
nickName: '', nickName: '',
password: '', password: '',
phone: '', phone: '',
status: 'enable', status: 'enable',
}); });
const options = ref([])
const validatePhone = (rule, value, callback) => {
const reg = /^1[3-9]\d{9}$/;
if (!value) {
callback(new Error('请输入手机号'));
} else if (!reg.test(value)) {
callback(new Error('请输入正确的手机号'));
} else {
callback();
}
}
const rules = ref({ const rules = ref({
username: { required: true, message: '请输入用户名称', trigger: 'blur' }, username: { required: true, message: '请输入用户名称', trigger: 'blur' },
password: { required: true, message: '请输入密码', trigger: 'blur' }, password: { required: true, message: '请输入密码', trigger: 'blur' },
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ validator: validatePhone, trigger: 'blur' }
],
}); });
const currentAccount = ref(null); const currentAccount = ref(null);
...@@ -94,6 +128,7 @@ ...@@ -94,6 +128,7 @@
const onHide = () => { const onHide = () => {
form.value = { form.value = {
username: '', username: '',
roles: [],
nickName: '', nickName: '',
password: '', password: '',
phone: '', phone: '',
...@@ -105,6 +140,9 @@ ...@@ -105,6 +140,9 @@
}; };
const openModal = (account) => { const openModal = (account) => {
account && (form.value = account); account && (form.value = account);
getDefualtRoles().then(res => {
options.value = res.result
})
currentAccount.value = account; currentAccount.value = account;
showModal.value = true; showModal.value = true;
}; };
......
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