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

业务审批

parent 0ccbd1ba
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
/> />
<!-- 表格 --> <!-- 表格 -->
<div class="card flex-1"> <div class="card flex-1" :style="wrapperstyle">
<!-- 表格主体 --> <!-- 表格主体 -->
<div> <div>
<slot name="table_top"></slot> <slot name="table_top"></slot>
...@@ -63,6 +63,10 @@ ...@@ -63,6 +63,10 @@
type: Object, type: Object,
required: true, required: true,
}, },
wrapperstyle: {
type: Object,
default: () => {}
},
selectdList: { selectdList: {
type: Array, type: Array,
default: undefined, default: undefined,
......
<template> <template>
<el-dialog v-model="dialogVisible" title="个人信息" width="500px" draggable> <el-dialog v-model="dialogVisible" title="个人信息" width="500px" draggable>
<span>This is userInfo</span> <div class="flex">
<span>用户名:{{username}}</span>
<span style="margin-left: 80px" v-if="username !== 'admin'">调解中心:{{currentTenant}}</span>
</div>
<div class="flex">
<span>手机号:{{userStore.userInfo.phone}}</span>
</div>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button> <el-button @click="dialogVisible = false">取消</el-button>
...@@ -11,12 +17,25 @@ ...@@ -11,12 +17,25 @@
</template> </template>
<script setup> <script setup>
import { useUserStore } from '@/stores/modules/user';
import { computed } from 'vue';
import { ref } from 'vue'; import { ref } from 'vue';
const userStore = useUserStore();
const currentTenant = ref();
const dialogVisible = ref(false); const dialogVisible = ref(false);
const openDialog = () => { const openDialog = () => {
dialogVisible.value = true; dialogVisible.value = true;
}; };
console.log('userStore', userStore.userInfo)
const username = computed(() => userStore.userInfo?.username);
if (userStore.userInfo?.tenants && userStore.userInfo?.tenants.length > 0) {
if (userStore.userInfo?.tenants.length < 2) {
currentTenant.value = userStore.userInfo?.tenants[0].name;
} else {
currentTenant.value = userStore.tenant.name;
}
}
defineExpose({ openDialog }); defineExpose({ openDialog });
</script> </script>
...@@ -34,42 +34,16 @@ ...@@ -34,42 +34,16 @@
</el-button> </el-button>
</template> --> </template> -->
</ProTable> </ProTable>
<vxe-modal <returnModal
resize ref="returnModalRef"
v-model="showModal" @submitForm="submitForm"
title="审批提示" :mergerCase="detail?.mergerCase"
height="282" />
width="450"
show-footer
esc-closable
>
<div class="w-full px-3 h-full overflow-auto flex-col flex mytable">
<template v-if="currentRow">
是否审批通过{{
currentRow
? `借款人${currentRow?.borrower?.name}, 还款金额${currentRow?.realRepayAmount},实际还款时间${currentRow?.realRepayTime}`
: ''
}}的数据?
</template>
<template v-else>
是否审批通过以下数据:<br />
<div v-for="(item, index) in selectdList" :key="index">
{{
`借款人${item?.borrower?.name}, 还款金额${item?.realRepayAmount},实际还款时间${item?.realRepayTime}`
}}
</div>
</template>
</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="repaymentApprove" lang="jsx"> <script setup name="repaymentApprove" lang="jsx">
import returnModal from './components/returnModal.vue';
import { computed } from 'vue'; import { computed } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { import {
...@@ -83,6 +57,7 @@ ...@@ -83,6 +57,7 @@
import { getTenantPage } from '@/api/tenant'; import { getTenantPage } from '@/api/tenant';
import { useAuthStore } from '@/stores/modules/auth'; import { useAuthStore } from '@/stores/modules/auth';
const { authButtonListGet } = useAuthStore(); // 获取用户权限列表 const { authButtonListGet } = useAuthStore(); // 获取用户权限列表
const returnModalRef = ref();
const { RepayType, FlowStatus } = useDict('RepayType', 'FlowStatus'); const { RepayType, FlowStatus } = useDict('RepayType', 'FlowStatus');
const ProTableRef = ref(); const ProTableRef = ref();
...@@ -145,12 +120,29 @@ ...@@ -145,12 +120,29 @@
return obj; return obj;
}; };
const changeStatus = async (row) => { const changeStatus = async (row) => {
if (row.id) { currentRow.value = row
currentRow.value = row; const type = RepayType.value?.find((v) => v.value === row.repayType)?.label
if (type === '分期还款') {
returnModalRef.value.openModal(
JSON.parse(JSON.stringify(row.byStagesRecord)),
JSON.parse(JSON.stringify(row)),
type
);
} else if (type === '直接还款') {
returnModalRef.value.openModal(
JSON.parse(JSON.stringify(row.loan)),
JSON.parse(JSON.stringify(row)),
type
);
} else { } else {
currentRow.value = null; {
returnModalRef.value.openModal(
JSON.parse(JSON.stringify(row.reduce)),
JSON.parse(JSON.stringify(row)),
type
);
}
} }
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(',');
...@@ -208,23 +200,7 @@ ...@@ -208,23 +200,7 @@
width: 80, width: 80,
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
if (row.reduce && row.reduce.reduceRecords) { return <>{row.cpe?.username}</>;
return (
<>
{Array.from(
new Set(row.reduce.reduceRecords.map((v) => v.loan?.cpe?.username))
).join(',')}
</>
);
} else if (row.stages && row.stages.loans) {
return (
<>
{Array.from(new Set(row.stages.loans.map((v) => v?.cpe?.username))).join(',')}
</>
);
} else {
return <>{row.cpe?.username}</>;
}
}, },
}, },
search: { el: 'input', props: { clearable: true }, key: 'cpeName', labelWidth: 105 }, search: { el: 'input', props: { clearable: true }, key: 'cpeName', labelWidth: 105 },
...@@ -233,21 +209,7 @@ ...@@ -233,21 +209,7 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
if (row.reduce && row.reduce.reduceRecords) { return <>{row.tenant?.name}</>;
return (
<>
{Array.from(
new Set(row.reduce.reduceRecords.map((v) => v.loan?.tenant?.name))
).join(',')}
</>
);
} else if (row.stages && row.stages.loans) {
return (
<>{Array.from(new Set(row.stages.loans.map((v) => v?.tenant?.name))).join(',')}</>
);
} else {
return <>{row.tenant?.name}</>;
}
}, },
}, },
enum: () => getTenantPage({ current: 1, size: 999999999, status: 'enable' }), enum: () => getTenantPage({ current: 1, size: 999999999, status: 'enable' }),
...@@ -329,10 +291,6 @@ ...@@ -329,10 +291,6 @@
{ {
field: 'code', field: 'code',
title: '操作', title: '操作',
visible:
((activeName.value === 'pending' && authButtonListGet.includes('repayment_tenant_apply_btn')) || (activeName.value === 'in_review' && authButtonListGet.includes('repayment_apply_btn')))
? true
: false,
slots: { slots: {
default: ({ row, rowIndex }) => { default: ({ row, rowIndex }) => {
if (row.flowStatus === 'pending' && authButtonListGet.includes('repayment_tenant_apply_btn')) { if (row.flowStatus === 'pending' && authButtonListGet.includes('repayment_tenant_apply_btn')) {
...@@ -351,6 +309,14 @@ ...@@ -351,6 +309,14 @@
</ElButton> </ElButton>
</> </>
); );
} else {
return (
<>
<ElButton type="primary" onClick={() => changeStatus(row)}>
查看
</ElButton>
</>
);
} }
}, },
}, },
......
...@@ -88,8 +88,10 @@ ...@@ -88,8 +88,10 @@
watch( watch(
() => AuditStatus.value, () => AuditStatus.value,
(newValue, oldValue) => { (newValue, oldValue) => {
activeName.value = AuditStatus.value[0].value if (AuditStatus.value[0]) {
query() activeName.value = AuditStatus.value[0].value
query()
}
} }
); );
const callMode = ref(''); const callMode = ref('');
......
...@@ -78,16 +78,16 @@ ...@@ -78,16 +78,16 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" v-if="currentType === '结清减免还款'"> <el-col :span="8">
<el-form-item class="w-full" label="付款凭证:" prop="name"> <el-form-item class="w-full" label="付款凭证:" prop="name">
<el-upload <el-upload
v-model:file-list="form.files" v-model:file-list="form.images"
:action="url" :action="url"
:headers="{ timeout: 180000 }" :headers="{ timeout: 180000 }"
list-type="picture-card" list-type="picture-card"
class="mypicture" class="mypicture"
:on-preview="handlePictureCardPreview"
:on-success="handleFileSuccess" :on-success="handleFileSuccess"
:auto-upload="true"
:on-remove="handleRemove" :on-remove="handleRemove"
> >
<div class="text-center"> <div class="text-center">
...@@ -164,6 +164,25 @@ ...@@ -164,6 +164,25 @@
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item class="w-full" label="付款凭证:" prop="name">
<el-upload
v-model:file-list="form.images"
:action="url"
:headers="{ timeout: 180000 }"
list-type="picture-card"
class="mypicture"
:on-preview="handlePictureCardPreview"
:on-success="handleFileSuccess"
:on-remove="handleRemove"
>
<div class="text-center">
<el-icon><Plus /></el-icon>
<div>付款相关附件</div>
</div>
</el-upload>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
</div> </div>
...@@ -180,6 +199,7 @@ ...@@ -180,6 +199,7 @@
<div class="font-bold pl-3">还款记录</div> <div class="font-bold pl-3">还款记录</div>
<ProTable <ProTable
:config="props.returnConfig" :config="props.returnConfig"
:wrapperstyle="{'overflow-x':'clip'}"
:data="props.returnData" :data="props.returnData"
:showPagination="false" :showPagination="false"
:showToolBar="false" :showToolBar="false"
...@@ -189,6 +209,9 @@ ...@@ -189,6 +209,9 @@
<el-button type="default" @click="showModal = false">取消</el-button> <el-button type="default" @click="showModal = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button> <el-button type="primary" @click="submitForm">确定</el-button>
</template> </template>
<el-dialog v-model="dialogVisible">
<img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
</vxe-modal> </vxe-modal>
</template> </template>
...@@ -223,12 +246,14 @@ ...@@ -223,12 +246,14 @@
const emits = defineEmits(['success']); const emits = defineEmits(['success']);
const form = reactive({ const form = reactive({
realRepayAmount: '', realRepayAmount: '',
files: [], images: [],
realRepayTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), realRepayTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
}); });
const dialogImageUrl = ref('');
const dialogVisible = ref(false);
const props = defineProps({ const props = defineProps({
mergerCase: String, mergerCase: String,
returnConfig: Array, returnConfig: Object,
returnData: Array, returnData: Array,
}); });
const radio = ref(0); const radio = ref(0);
...@@ -262,7 +287,7 @@ ...@@ -262,7 +287,7 @@
const openModal = (info, detail, type) => { const openModal = (info, detail, type) => {
showModal.value = true; showModal.value = true;
form.realRepayAmount = ''; form.realRepayAmount = '';
form.files = []; form.images = [];
form.realRepayTime = dayjs().format('YYYY-MM-DD HH:mm:ss'); form.realRepayTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
currentInfo.value = info; currentInfo.value = info;
console.log('currentInfo', currentInfo.value); console.log('currentInfo', currentInfo.value);
...@@ -272,7 +297,8 @@ ...@@ -272,7 +297,8 @@
}; };
const handleRemove = (uploadFile, uploadFiles) => { const handleRemove = (uploadFile, uploadFiles) => {
console.log(uploadFile, uploadFiles); const index = form.images.findIndex((v) => v.name === uploadFile.name);
form.images.splice(index, 1);
}; };
const handlePictureCardPreview = (uploadFile) => { const handlePictureCardPreview = (uploadFile) => {
...@@ -280,12 +306,16 @@ ...@@ -280,12 +306,16 @@
dialogVisible.value = true; dialogVisible.value = true;
}; };
const submitForm = () => { const submitForm = () => {
console.log('currentInfo.value', currentInfo.value, currentDetail.value, tabledata.value); let images = JSON.parse(JSON.stringify(form.images.map((v) => v.url)));
images = images.map((v) => {
return v.replace(envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/', '');
});
formRef.value.validate((valid) => { formRef.value.validate((valid) => {
if (valid) { if (valid) {
const param = { const param = {
repayType: RepayType.value.find((v) => v.label === currentType.value).value, repayType: RepayType.value.find((v) => v.label === currentType.value).value,
...form, ...form,
images,
repayAmount: form.realRepayAmount, repayAmount: form.realRepayAmount,
borrower: currentInfo.value.borrower, borrower: currentInfo.value.borrower,
flowStatus: 'pending', flowStatus: 'pending',
...@@ -340,7 +370,10 @@ ...@@ -340,7 +370,10 @@
}); });
}; };
const handleFileSuccess = (response, file, fileList) => { const handleFileSuccess = (response, file, fileList) => {
console.log('888877', response, file, fileList); if (file.uid) {
const item = form.images.find((v) => v.uid === file.uid);
item.url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + response.message;
}
}; };
const config = computed(() => { const config = computed(() => {
return { return {
......
...@@ -13,11 +13,13 @@ ...@@ -13,11 +13,13 @@
type="primary" type="primary"
@click="reduce" @click="reduce"
:disabled="detail && detail.repayStatus && detail.repayStatus === 'over'" :disabled="detail && detail.repayStatus && detail.repayStatus === 'over'"
v-permission="'case_handle'"
>减免申请</el-button >减免申请</el-button
> >
<el-button <el-button
type="primary" type="primary"
@click="split" @click="split"
v-permission="'case_handle'"
:disabled="detail && detail.repayStatus && detail.repayStatus === 'over'" :disabled="detail && detail.repayStatus && detail.repayStatus === 'over'"
>分期申请</el-button >分期申请</el-button
> >
...@@ -908,6 +910,7 @@ ...@@ -908,6 +910,7 @@
detail.value.repayStatus && detail.value.repayStatus &&
detail.value.repayStatus === 'over' detail.value.repayStatus === 'over'
} }
v-permission={'case_handle'}
icon={Phone} icon={Phone}
link link
></ElButton> ></ElButton>
...@@ -1034,7 +1037,7 @@ ...@@ -1034,7 +1037,7 @@
{ {
field: 'code', field: 'code',
fixed: 'right', fixed: 'right',
title: '', title: '操作',
slots: { slots: {
default: ({ row, rowIndex }) => { default: ({ row, rowIndex }) => {
return ( return (
...@@ -1042,6 +1045,7 @@ ...@@ -1042,6 +1045,7 @@
<ElButton <ElButton
type="primary" type="primary"
onClick={() => returnCrash(row, '直接还款')} onClick={() => returnCrash(row, '直接还款')}
v-permission={'case_handle'}
disabled={row.repayStatus == 'over'} disabled={row.repayStatus == 'over'}
> >
还款 还款
...@@ -1213,6 +1217,7 @@ ...@@ -1213,6 +1217,7 @@
rowIndex !== splitCanIndex.value || rowIndex !== splitCanIndex.value ||
(detail.value.repayStatus && detail.value.repayStatus === 'over') (detail.value.repayStatus && detail.value.repayStatus === 'over')
} }
v-permission={'case_handle'}
> >
还款 还款
</ElButton> </ElButton>
...@@ -1378,6 +1383,7 @@ ...@@ -1378,6 +1383,7 @@
row.flowStatus !== 'pass' || row.flowStatus !== 'pass' ||
(detail.value.repayStatus && detail.value.repayStatus === 'over') (detail.value.repayStatus && detail.value.repayStatus === 'over')
} }
v-permission={'case_handle'}
> >
还款 还款
</ElButton> </ElButton>
......
...@@ -87,8 +87,10 @@ ...@@ -87,8 +87,10 @@
watch( watch(
() => AuditStatus.value, () => AuditStatus.value,
(newValue, oldValue) => { (newValue, oldValue) => {
activeName.value = AuditStatus.value[0].value if (AuditStatus.value[0]) {
query() activeName.value = AuditStatus.value[0].value
query()
}
} }
); );
const callMode = ref(''); const callMode = ref('');
......
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