Commit 562aea40 authored by 沈翠玲's avatar 沈翠玲

业务审批

parent 7fcd7431
...@@ -45,28 +45,6 @@ ...@@ -45,28 +45,6 @@
const callDrawerRef = ref(); const callDrawerRef = ref();
const srcList = ref([]); const srcList = ref([]);
const RefImage = ref(false); const RefImage = ref(false);
const options = [
{
value: 2,
label: '2',
},
{
value: 3,
label: '3',
},
{
value: 4,
label: '4',
},
{
value: 5,
label: '5',
},
{
value: 6,
label: '6',
},
];
const preview = (item, type) => { const preview = (item, type) => {
const list = []; const list = [];
item[type].forEach((v) => { item[type].forEach((v) => {
......
...@@ -129,6 +129,7 @@ ...@@ -129,6 +129,7 @@
<el-button type="primary" @click="submitForm('pass')">通过</el-button> <el-button type="primary" @click="submitForm('pass')">通过</el-button>
</template> </template>
</vxe-modal> </vxe-modal>
<el-image-viewer :url-list="srcList" v-if="RefImage" @close="RefImage = false" />
</div> </div>
</template> </template>
...@@ -140,6 +141,10 @@ ...@@ -140,6 +141,10 @@
import { ElMessageBox, ElMessage, ElButton } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { getTenantPage } from '@/api/tenant'; import { getTenantPage } from '@/api/tenant';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
import { getAppEnvConfig } from '@/utils/env';
const envs = getAppEnvConfig();
const srcList = ref([]);
const RefImage = ref(false);
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus", "CaseStatus"); const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus", "CaseStatus");
const ProTableRef = ref(); const ProTableRef = ref();
...@@ -156,28 +161,6 @@ ...@@ -156,28 +161,6 @@
selectdList.value = []; selectdList.value = [];
} }
}; };
const options = [
{
value: 2,
label: '2',
},
{
value: 3,
label: '3',
},
{
value: 4,
label: '4',
},
{
value: 5,
label: '5',
},
{
value: 6,
label: '6',
},
];
const splitDeConfig = reactive({ const splitDeConfig = reactive({
columns: [ columns: [
{ {
...@@ -226,7 +209,14 @@ ...@@ -226,7 +209,14 @@
query(); query();
}; };
const preview = (item, type) => {
const list = [];
item[type].forEach((v) => {
list.push(envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v);
});
RefImage.value = true;
srcList.value = list;
};
const config = computed(() => { const config = computed(() => {
return { return {
columns: [ columns: [
...@@ -337,8 +327,7 @@ ...@@ -337,8 +327,7 @@
field: 'totalPeriod', field: 'totalPeriod',
showOverflow: 'tooltip', showOverflow: 'tooltip',
title: '还款期数', title: '还款期数',
enum: options, search: { el: 'input', props: { filterable: true, type: 'number' }, span: 1, labelWidth: 80 },
search: { el: 'select', props: { filterable: true }, span: 1, labelWidth: 80 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
width: 80, width: 80,
}, },
...@@ -360,6 +349,27 @@ ...@@ -360,6 +349,27 @@
search: { el: 'input', labelWidth: 80 }, search: { el: 'input', labelWidth: 80 },
width: 110, width: 110,
}, },
{
field: 'code',
title: '附件',
showOverflow: 'tooltip',
width: 70,
slots: {
default: ({ row, rowIndex }) => {
if (row.images && row.images.length > 0) {
return (
<>
<div className="flex justify-center">
<ElButton onClick={() => preview(row, 'images')} link type="primary">
查看
</ElButton>
</div>
</>
);
}
},
},
},
{ {
field: 'flowStatus', field: 'flowStatus',
title: '审核状态', title: '审核状态',
......
...@@ -109,6 +109,7 @@ ...@@ -109,6 +109,7 @@
<el-button type="primary" @click="submitForm('pass')">通过</el-button> <el-button type="primary" @click="submitForm('pass')">通过</el-button>
</template> </template>
</vxe-modal> </vxe-modal>
<el-image-viewer :url-list="srcList" v-if="RefImage" @close="RefImage = false" />
</div> </div>
</template> </template>
...@@ -120,11 +121,15 @@ ...@@ -120,11 +121,15 @@
import { ElMessageBox, ElMessage, ElButton } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { getTenantPage } from '@/api/tenant'; import { getTenantPage } from '@/api/tenant';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
import { getAppEnvConfig } from '@/utils/env';
const envs = getAppEnvConfig();
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus", "CaseStatus"); const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus", "CaseStatus");
const ProTableRef = ref(); const ProTableRef = ref();
const showModal = ref(false); const showModal = ref(false);
const srcList = ref([]);
const RefImage = ref(false);
const selectdList = ref([]); const selectdList = ref([]);
const onCheckboxChange = (row) => { const onCheckboxChange = (row) => {
console.log('row', row); console.log('row', row);
...@@ -140,6 +145,14 @@ ...@@ -140,6 +145,14 @@
const changeStatus = async () => { const changeStatus = async () => {
showModal.value = true; showModal.value = true;
}; };
const preview = (item, type) => {
const list = [];
item[type].forEach((v) => {
list.push(envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + v);
});
RefImage.value = true;
srcList.value = list;
};
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(',');
await flowStatusByIds({ await flowStatusByIds({
...@@ -250,6 +263,27 @@ ...@@ -250,6 +263,27 @@
title: '调解中心', title: '调解中心',
width: 100, width: 100,
}, },
{
field: 'code',
title: '附件',
showOverflow: 'tooltip',
width: 70,
slots: {
default: ({ row, rowIndex }) => {
if (row.images && row.images.length > 0) {
return (
<>
<div className="flex justify-center">
<ElButton onClick={() => preview(row, 'images')} link type="primary">
查看
</ElButton>
</div>
</>
);
}
},
},
},
{ {
field: 'flowStatus', field: 'flowStatus',
title: '审核状态', title: '审核状态',
......
...@@ -304,6 +304,7 @@ ...@@ -304,6 +304,7 @@
askForStatus: 'Pending', askForStatus: 'Pending',
flowStatus: 'pending', flowStatus: 'pending',
...form, ...form,
images: form.images.map((v) => v.url)?.length > 0 ? form.images.map((v) => v.url) : null,
reduceRecords: list, reduceRecords: list,
}; };
console.log('sadas', params); console.log('sadas', params);
......
...@@ -271,28 +271,14 @@ ...@@ -271,28 +271,14 @@
const options = ref([ const options = ref([
]); ]);
const getPlatforms = (id) => { const getPlatforms = (id) => {
for (let i = 2; i <= 6; i++) { const maxStagesNum = Number(currentDetail.value.maxStagesNum) || 6
for (let i = 2; i <= maxStagesNum; i++) {
options.value.push({ options.value.push({
value: i, value: i,
label: i + '', label: i + '',
}) })
} }
console.log('options.value', options.value) minAmount.value = Number(currentDetail.value.minAmount);
getByIdPlatforms(id).then((res) => {
console.log('resres', res);
if (res.success) {
if (res.result.maxStagesNum) {
const list = options.value.filter((v) => v.value > res.result.maxStagesNum);
list.forEach((e) => {
e['disabled'] = true;
});
}
if (res.result.minAmount) {
minAmount.value = res.result.minAmount;
}
}
//
});
}; };
const selectdList = ref([]); const selectdList = ref([]);
......
...@@ -513,22 +513,22 @@ ...@@ -513,22 +513,22 @@
<returnModal <returnModal
ref="returnModalRef" ref="returnModalRef"
@success="query('还款')" @success="query('还款')"
:mergerCase="detail?.manageOrg?.mergerCase" :mergerCase="detail?.mergerCase"
></returnModal> ></returnModal>
<reduceDrawer <reduceDrawer
ref="reduceDrawerRef" ref="reduceDrawerRef"
@success="query('减免')" @success="query('减免')"
:mergerCase="detail?.manageOrg?.mergerCase" :mergerCase="detail?.mergerCase"
></reduceDrawer> ></reduceDrawer>
<splitDrawer <splitDrawer
ref="splitDrawerRef" ref="splitDrawerRef"
@success="query('分期')" @success="query('分期')"
:mergerCase="detail?.manageOrg?.mergerCase" :mergerCase="detail?.mergerCase"
></splitDrawer> ></splitDrawer>
<callDrawer <callDrawer
ref="callDrawerRef" ref="callDrawerRef"
@success="query('跟进')" @success="query('跟进')"
:mergerCase="detail?.manageOrg?.mergerCase" :mergerCase="detail?.mergerCase"
></callDrawer> ></callDrawer>
<el-image-viewer :url-list="srcList" v-if="RefImage" @close="RefImage = false" /> <el-image-viewer :url-list="srcList" v-if="RefImage" @close="RefImage = false" />
</div> </div>
...@@ -992,19 +992,19 @@ ...@@ -992,19 +992,19 @@
field: 'totalRepayAmount', field: 'totalRepayAmount',
showOverflow: 'tooltip', showOverflow: 'tooltip',
title: '还款总额', title: '还款总额',
width: 80, width: 70,
}, },
{ {
field: 'applyDate', field: 'applyDate',
title: '分期申请时间', title: '分期申请时间',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 115, width: 100,
}, },
{ {
field: 'effectiveTime', field: 'effectiveTime',
title: '分期生效时间', title: '分期生效时间',
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 115, width: 100,
}, },
{ {
field: 'totalPeriod', field: 'totalPeriod',
...@@ -1024,6 +1024,26 @@ ...@@ -1024,6 +1024,26 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 110, width: 110,
}, },
{
field: 'code',
title: '附件',
width: 55,
slots: {
default: ({ row, rowIndex }) => {
if (row.images && row.images.length > 0) {
return (
<>
<div className="flex justify-center">
<ElButton onClick={() => preview(row, 'images')} link type="primary">
查看
</ElButton>
</div>
</>
);
}
},
},
},
], ],
onCellClick: onCellClick, onCellClick: onCellClick,
toolbarConfig: { enabled: false }, toolbarConfig: { enabled: false },
...@@ -1177,6 +1197,26 @@ ...@@ -1177,6 +1197,26 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
title: '减免生效时间', title: '减免生效时间',
}, },
{
field: 'code',
title: '附件',
width: 60,
slots: {
default: ({ row, rowIndex }) => {
if (row.images && row.images.length > 0) {
return (
<>
<div className="flex justify-center">
<ElButton onClick={() => preview(row, 'images')} link type="primary">
查看
</ElButton>
</div>
</>
);
}
},
},
},
{ {
field: 'code', field: 'code',
title: '操作', title: '操作',
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getCreditPage } from '@/api/property'; import { getCreditPage } from '@/api/property';
import { ElButton, ElMessage, ElTag } from 'element-plus';
const caseModalRef = ref(); const caseModalRef = ref();
const caseLRef = ref(); const caseLRef = ref();
import { onMounted } from 'vue'; import { onMounted } from 'vue';
...@@ -143,6 +144,31 @@ ...@@ -143,6 +144,31 @@
width: 80, width: 80,
search: { el: 'input', props: { clearable: true }, labelWidth: 80 }, search: { el: 'input', props: { clearable: true }, labelWidth: 80 },
}, },
{
field: 'maxStagesNum',
title: '分期最大期数',
width: 60,
showOverflow: 'tooltip',
search: { el: 'input', props: { clearable: true } },
},
{
field: 'minAmount',
title: '最低分期金额',
width: 80,
showOverflow: 'tooltip',
search: { el: 'input', props: { clearable: true } },
},
{
field: 'mergerCase',
title: '是否共案处理',
showOverflow: 'tooltip',
width: 100,
slots: {
default: ({ row }) => {
return <ElTag>{row.mergerCase == 'Y' ? '是' : '否'}</ElTag>;
},
},
},
{ {
field: 'sumRepayAmount', field: 'sumRepayAmount',
title: '累计还款金额', title: '累计还款金额',
......
<template> <template>
<div class="table-box"> <div class="table-box">
<div class="card flex mb-2" style="padding-top: 0"> <div class="card flex mb-2" style="padding-top: 0">
<div class="flex-1"> <div style="width: 30%">
<div class="mb-1 text-center step"> <div class="mb-1 text-center step">
<div class="xuhao">1</div> <div class="xuhao">1</div>
上传文件 上传文件
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="flex-1"> <div style="width: 30%">
<div class="mb-1 text-center step"> <div class="mb-1 text-center step">
<div class="xuhao">2</div> <div class="xuhao">2</div>
检查数据 检查数据
...@@ -70,17 +70,38 @@ ...@@ -70,17 +70,38 @@
上传数据 上传数据
</div> </div>
<div class="w-full flex items-center justify-center pt-5"> <div class="w-full flex items-center justify-center pt-5">
<div class="px-7"> <div>
<el-form ref="formRef" inline :model="form" :rules="rules" label-width="85px"> <el-form ref="formRef" inline :model="form" :rules="rules" label-width="120px">
<el-form-item class="w-full" label="导入批次:" prop="code"> <el-row :gutter="10">
<el-input v-model="form.code" placeholder="请输入" style="width: 100%" /> <el-col :span="24">
</el-form-item> <el-form-item class="w-full" label="导入批次:" prop="code" >
<!-- <el-form-item class="w-full" label="委案合同:" prop="contractNo"> <el-input v-model="form.code" placeholder="请输入" style="width: 100%" />
<el-input v-model="form.contractNo" placeholder="请输入" style="width: 100%" /> </el-form-item>
</el-form-item> --> </el-col>
<el-form-item class="w-full" label="折扣:" prop="discount"> <el-col :span="11">
<el-input v-model="form.discount" placeholder="请输入" style="width: 100%" /> <el-form-item class="w-full" label="分期最大期数:" prop="maxStagesNum" >
</el-form-item> <el-input v-model.number="form.maxStagesNum" placeholder="请输入" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="13">
<el-form-item class="w-full" label="最低分期金额:" prop="minAmount">
<el-input v-model="form.minAmount" placeholder="请输入" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item class="w-full" label="折扣:" prop="discount">
<el-input v-model="form.discount" placeholder="请输入" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="13">
<el-form-item class="w-full" label="是否共案处理:" prop="mergerCase">
<el-radio-group v-model="form.mergerCase">
<el-radio value="Y"></el-radio>
<el-radio value="N"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<div class="flex justify-end"> <div class="flex justify-end">
<el-button <el-button
...@@ -119,7 +140,7 @@ ...@@ -119,7 +140,7 @@
import errorModal from './components/errorModal.vue'; import errorModal from './components/errorModal.vue';
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, ElTag } from 'element-plus';
import { Upload, ArrowRight } 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';
...@@ -134,10 +155,20 @@ ...@@ -134,10 +155,20 @@
} }
} }
} }
const checkminAmount = (rule, value, callback) => {
if (isNaN(Number(value))) {
callback(new Error('请输入数字值'));
} else {
callback();
}
}
const rules = ref({ const rules = ref({
discount: [ discount: [
{ validator: checkDiscount, trigger: 'blur' }, { validator: checkDiscount, trigger: 'blur' },
], ],
minAmount: [
{ validator: checkminAmount, trigger: 'blur' },
]
}); });
const downloadfile = inject('download'); const downloadfile = inject('download');
const formRef = ref(); const formRef = ref();
...@@ -180,12 +211,29 @@ ...@@ -180,12 +211,29 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true } },
}, },
// { {
// field: 'contractNo', field: 'maxStagesNum',
// title: '委案合同', title: '分期最大期数',
// showOverflow: 'tooltip', showOverflow: 'tooltip',
// search: { el: 'input', props: { clearable: true } }, search: { el: 'input', props: { clearable: true } },
// }, },
{
field: 'minAmount',
title: '最低分期金额',
showOverflow: 'tooltip',
search: { el: 'input', props: { clearable: true } },
},
{
field: 'mergerCase',
title: '是否共案处理',
showOverflow: 'tooltip',
width: 100,
slots: {
default: ({ row }) => {
return <ElTag>{row.mergerCase == 'Y' ? '是' : '否'}</ElTag>;
},
},
},
{ {
field: 'code', field: 'code',
title: '资产类型', title: '资产类型',
...@@ -264,7 +312,9 @@ ...@@ -264,7 +312,9 @@
const form = reactive({ const form = reactive({
path: '', path: '',
code: '', code: '',
contractNo: '', maxStagesNum: '',
minAmount: '',
mergerCase: 'N',
discount: '', discount: '',
}); });
const upload = reactive({ const upload = reactive({
...@@ -329,11 +379,21 @@ ...@@ -329,11 +379,21 @@
const query = () => ProTableRef.value?.search(); const query = () => ProTableRef.value?.search();
const submitData = async () => { const submitData = async () => {
try { try {
if (!form.maxStagesNum) return ElMessage.warning({
message: '分期最大期数必填',
plain: true,
});
// if (!form.minAmount) return ElMessage.warning({
// message: '最低分期金额必填',
// plain: true,
// });
await formRef.value.validate(); await formRef.value.validate();
await LoanSubmit({ await LoanSubmit({
file: form.path, file: form.path,
code: form.code, code: form.code,
contractNo: form.contractNo, maxStagesNum: form.maxStagesNum,
minAmount: form.minAmount,
mergerCase: form.mergerCase,
discount: form.discount, discount: form.discount,
}).then((res) => { }).then((res) => {
ElMessage.success({ ElMessage.success({
...@@ -345,7 +405,9 @@ ...@@ -345,7 +405,9 @@
query(); query();
form['path'] = ''; form['path'] = '';
form['code'] = ''; form['code'] = '';
form['contractNo'] = ''; form['maxStagesNum'] = '';
form['minAmount'] = '';
form['mergerCase'] = 'N';
form['discount'] = ''; form['discount'] = '';
}); });
} catch {} } catch {}
...@@ -358,7 +420,7 @@ ...@@ -358,7 +420,7 @@
<style lang="scss" scoped> <style lang="scss" scoped>
.importwrapper { .importwrapper {
:deep(.el-form-item) { :deep(.el-form-item) {
margin-bottom: 3px !important; margin-bottom: 4px !important;
} }
} }
.xuhao { .xuhao {
......
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