Commit 809357e7 authored by 沈翠玲's avatar 沈翠玲

页面优化

parent 7e8f80c0
<?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="1740191286370" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1538" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M815.104 69.632q27.648 25.6 44.032 42.496t25.088 28.672 10.752 19.968 2.048 14.336l0 16.384-151.552 0q-10.24 0-17.92-7.68t-12.8-17.92-7.68-20.992-2.56-16.896l0-126.976 3.072 0q8.192 0 16.896 2.56t19.968 9.728 28.16 20.48 42.496 35.84zM640 129.024q0 20.48 6.144 42.496t19.456 40.96 33.792 31.232 48.128 12.288l149.504 0 0 577.536q0 29.696-11.776 53.248t-31.232 39.936-43.008 25.6-46.08 9.216l-503.808 0q-19.456 0-42.496-11.264t-43.008-29.696-33.28-41.984-13.312-49.152l0-696.32q0-21.504 9.728-44.544t26.624-42.496 38.4-32.256 45.056-12.8l391.168 0 0 128zM704.512 768q26.624 0 45.056-18.944t18.432-45.568-18.432-45.056-45.056-18.432l-384 0q-26.624 0-45.056 18.432t-18.432 45.056 18.432 45.568 45.056 18.944l384 0zM768 448.512q0-26.624-18.432-45.568t-45.056-18.944l-384 0q-26.624 0-45.056 18.944t-18.432 45.568 18.432 45.056 45.056 18.432l384 0q26.624 0 45.056-18.432t18.432-45.056z" p-id="1539"></path></svg>
\ No newline at end of file
<?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="1740041986415" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="40801" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M522.666667 761.6c27.733333 0 41.6-11.733333 41.6-46.933333v-48c0-3.2 3.2-5.333333 6.4-5.333334h64c28.8 0 43.733333-23.466667 43.733333-39.466666s-14.933333-39.466667-43.733333-39.466667h-64c-3.2 0-6.4-2.133333-6.4-5.333333v-26.666667c0-3.2 3.2-5.333333 6.4-5.333333h64c28.8 0 43.733333-23.466667 43.733333-39.466667s-14.933333-39.466667-43.733333-39.466667h-28.8c-5.333333 0-7.466667-4.266667-5.333334-8.533333l53.333334-68.266667c5.333333-7.466667 9.6-13.866667 12.8-19.2 2.133333-3.2 3.2-6.4 3.2-10.666666 1.066667-9.6-2.133333-20.266667-11.733334-26.666667-6.4-4.266667-13.866667-6.4-23.466666-6.4-7.466667 0-13.866667 1.066667-19.2 3.2-5.333333 2.133333-9.6 5.333333-12.8 9.6-3.2 3.2-7.466667 8.533333-10.666667 13.866667-4.266667 5.333333-7.466667 10.666667-10.666667 14.933333L526.933333 437.333333c-2.133333 3.2-8.533333 3.2-10.666666 0l-64-74.666666c-8.533333-11.733333-16-20.266667-22.4-25.6-6.4-5.333333-14.933333-8.533333-25.6-8.533334s-19.2 3.2-25.6 8.533334c-6.4 5.333333-9.6 12.8-9.6 21.333333 0 5.333333 1.066667 9.6 3.2 13.866667 2.133333 4.266667 7.466667 10.666667 14.933333 20.266666l56.533333 66.133334c3.2 3.2 0 8.533333-5.333333 8.533333h-27.733333c-29.866667 0-44.8 23.466667-44.8 39.466667s14.933333 39.466667 44.8 39.466666h64c3.2 0 6.4 2.133333 6.4 5.333334v26.666666c0 3.2-3.2 5.333333-6.4 5.333334h-64c-29.866667 0-44.8 23.466667-44.8 39.466666s14.933333 39.466667 44.8 39.466667h64c3.2 0 6.4 2.133333 6.4 5.333333V714.666667c-1.066667 35.2 13.866667 46.933333 41.6 46.933333z" fill="#234ca3" p-id="40802"></path><path d="M512 86.4c-70.4 0-138.666667 17.066667-200.533333 50.133333L289.066667 96c-8.533333-17.066667-33.066667-14.933333-39.466667 3.2l-65.066667 132.266667c-3.2 9.6 2.133333 21.333333 12.8 24.533333l149.333334 24.533333c18.133333 6.4 34.133333-12.8 25.6-29.866666L352 212.266667c49.066667-26.666667 103.466667-40.533333 160-40.533334 187.733333 0 341.333333 153.6 341.333333 341.333334s-153.6 341.333333-341.333333 341.333333-341.333333-153.6-341.333333-341.333333c0-21.333333 2.133333-42.666667 5.333333-62.933334 4.266667-23.466667-10.666667-45.866667-34.133333-50.133333-23.466667-4.266667-45.866667 10.666667-50.133334 34.133333-4.266667 25.6-6.4 52.266667-6.4 78.933334 0 235.733333 190.933333 426.666667 426.666667 426.666666s426.666667-190.933333 426.666667-426.666666-190.933333-426.666667-426.666667-426.666667z" fill="#234ca3" p-id="40803"></path></svg>
\ No newline at end of file
...@@ -186,7 +186,6 @@ ...@@ -186,7 +186,6 @@
if (props.config.onCheckboxAll) { if (props.config.onCheckboxAll) {
props.config.onCheckboxAll({checked: false, records: []}) props.config.onCheckboxAll({checked: false, records: []})
} }
emit('search', totalParam.value);
}; };
const _reset = () => { const _reset = () => {
......
...@@ -140,10 +140,12 @@ ...@@ -140,10 +140,12 @@
<script setup name="systemLog" lang="jsx"> <script setup name="systemLog" lang="jsx">
import splitDrawer from './components/splitDrawer.vue'; import splitDrawer from './components/splitDrawer.vue';
import { computed } from 'vue'; import { computed } from 'vue';
import { inject } from 'vue';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getByStagesPage, byStagesflowStatusByIds } from '@/api/property'; import { getByStagesPage, byStagesflowStatusByIds } from '@/api/property';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { ElMessageBox, ElMessage, ElButton } from 'element-plus'; import { ElMessageBox, ElMessage, ElButton } from 'element-plus';
import { Download } from '@element-plus/icons-vue';
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'; import { getAppEnvConfig } from '@/utils/env';
...@@ -151,6 +153,7 @@ ...@@ -151,6 +153,7 @@
const srcList = ref([]); const srcList = ref([]);
const RefImage = ref(false); 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 downloadfile = inject('download');
const ProTableRef = ref(); const ProTableRef = ref();
const showModal = ref(false); const showModal = ref(false);
...@@ -159,6 +162,10 @@ ...@@ -159,6 +162,10 @@
console.log('row', row); console.log('row', row);
selectdList.value = row.records; selectdList.value = row.records;
}; };
const download = (item) => {
const name = item.slice(item.lastIndexOf('/') + 1, item.length);
downloadfile('/sys/static/' + item, {}, name);
};
const splitDrawerRef = ref(); const splitDrawerRef = ref();
const onCheckboxAll = (flag) => { const onCheckboxAll = (flag) => {
if (flag.checked) { if (flag.checked) {
...@@ -372,11 +379,11 @@ ...@@ -372,11 +379,11 @@
if (row.images && row.images.length > 0) { if (row.images && row.images.length > 0) {
return ( return (
<> <>
<div className="flex justify-center"> {row.images.map((item, index) => (
<ElButton onClick={() => preview(row, 'images')} link type="primary"> <el-icon>
查看 <Download onClick={() => download(item)} />
</ElButton> </el-icon>
</div> ))}
</> </>
); );
} }
......
...@@ -118,14 +118,16 @@ ...@@ -118,14 +118,16 @@
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { getReducePage, flowStatusByIds } from '@/api/property'; import { getReducePage, flowStatusByIds } from '@/api/property';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { inject } from 'vue';
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 { Download } from '@element-plus/icons-vue';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
const envs = getAppEnvConfig(); 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 downloadfile = inject('download');
const ProTableRef = ref(); const ProTableRef = ref();
const showModal = ref(false); const showModal = ref(false);
const srcList = ref([]); const srcList = ref([]);
...@@ -135,6 +137,10 @@ ...@@ -135,6 +137,10 @@
console.log('row', row); console.log('row', row);
selectdList.value = row.records; selectdList.value = row.records;
}; };
const download = (item) => {
const name = item.slice(item.lastIndexOf('/') + 1, item.length);
downloadfile('/sys/static/' + item, {}, name);
};
const onCheckboxAll = (flag) => { const onCheckboxAll = (flag) => {
if (flag.checked) { if (flag.checked) {
selectdList.value = flag.records; selectdList.value = flag.records;
...@@ -273,11 +279,11 @@ ...@@ -273,11 +279,11 @@
if (row.images && row.images.length > 0) { if (row.images && row.images.length > 0) {
return ( return (
<> <>
<div className="flex justify-center"> {row.images.map((item, index) => (
<ElButton onClick={() => preview(row, 'images')} link type="primary"> <el-icon>
查看 <Download onClick={() => download(item)} />
</ElButton> </el-icon>
</div> ))}
</> </>
); );
} }
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
ref="caseLRef" ref="caseLRef"
:api="getTrackRecord" :api="getTrackRecord"
:selectdList="selectdList" :selectdList="selectdList"
:dataCallback="dataCallback"
:paramCallback="paramCallback" :paramCallback="paramCallback"
> >
<!-- 表格 header 按钮 --> <!-- 表格 header 按钮 -->
...@@ -144,6 +145,9 @@ ...@@ -144,6 +145,9 @@
// obj['others'] = 'Y' // obj['others'] = 'Y'
return obj; return obj;
}; };
const dataCallback = (data) => {
console.log('data', data)
}
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)));
...@@ -483,7 +487,10 @@ ...@@ -483,7 +487,10 @@
}); });
query(); query();
}; };
const query = () => caseLRef.value?.search(); const query = () => {
caseLRef.value?.search()
tabs.value
};
onMounted(() => { onMounted(() => {
query(); query();
......
...@@ -381,7 +381,7 @@ ...@@ -381,7 +381,7 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
enum: CaseStatus, enum: CaseStatus,
// search: { el: 'select', props: { filterable: true }, labelWidth: 90 }, search: { el: 'select', props: { filterable: true }, labelWidth: 105 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
......
...@@ -2,6 +2,46 @@ ...@@ -2,6 +2,46 @@
<div class="table-box"> <div class="table-box">
<div> <div>
<ProTable :config="config" ref="caseLRef" :api="getLoanpage" :paramCallback="paramCallback" :selectdList="selectdList"> <ProTable :config="config" ref="caseLRef" :api="getLoanpage" :paramCallback="paramCallback" :selectdList="selectdList">
<template #table_top>
<div class="style-lable" style="width: 100%">
<div class="item_warp" style="width: 19%">
<div class="img_warp">
<img src="@/assets/images/caselist.svg" />
</div>
<div class="title_warp">
<div class="items">在派案件数量</div>
<div class="item items1">{{statisis.caseNum}}</div>
</div>
</div>
<div class="item_warp" style="width: 19%">
<div class="img_warp">
<img src="@/assets/images/userlist.svg" />
</div>
<div class="title_warp">
<div class="items">在派案人人数</div>
<div class="item items1">{{statisis.cpeNum}}</div>
</div>
</div>
<div class="item_warp" style="width: 19%">
<div class="img_warp">
<img src="@/assets/images/money.svg" />
</div>
<div class="title_warp">
<div class="items">在派委案金额</div>
<div class="item items1">{{statisis.amount}}</div>
</div>
</div>
<div class="item_warp" style="width: 19%">
<div class="img_warp">
<img src="@/assets/images/tocrash.svg" />
</div>
<div class="title_warp">
<div class="items">待还金额</div>
<div class="item items1">{{statisis.amount}}</div>
</div>
</div>
</div>
</template>
<!-- 表格 header 按钮 --> <!-- 表格 header 按钮 -->
<template #left_buttons> <template #left_buttons>
<div class="flex rounded w-full h-11 items-center pl-2 btn-grp mb-1"> <div class="flex rounded w-full h-11 items-center pl-2 btn-grp mb-1">
...@@ -27,12 +67,47 @@ ...@@ -27,12 +67,47 @@
resize resize
v-model="showModal" v-model="showModal"
title="提示" title="提示"
height="242" height="342"
width="450" width="560"
show-footer show-footer
esc-closable esc-closable
> >
<div class="w-full px-3 h-full overflow-auto flex-col flex mytable"> <div class="top">
<div class="number-box">
<div class="number-left">
<div class="icon-wrapper">
<img src="@/assets/images/userlist.svg" />
</div>
</div>
<div class="number-right">
<p>收回客户数量</p>
<p>{{ statisis.unCustomerNum }}</p>
</div>
</div>
<div class="number-box">
<div class="number-left">
<div class="icon-wrapper">
<img src="@/assets/images/caselist.svg" />
</div>
</div>
<div class="number-right">
<p>收回案件数</p>
<p>{{ statisis.unCaseNum }}</p>
</div>
</div>
<div class="number-box">
<div class="number-left">
<div class="icon-wrapper">
<img src="@/assets/images/money.svg" />
</div>
</div>
<div class="number-right">
<p>预计收回金额</p>
<p>¥{{ statisis.unAmount }}</p>
</div>
</div>
</div>
<div class="w-full px-3 mt-3 overflow-auto flex-col flex mytable">
⚠️回收处理后可重新分派<br /> ⚠️回收处理后可重新分派<br />
回收:只回收未留案的案件<br /> 回收:只回收未留案的案件<br />
强制回收:所有案件都会回收,留案案件会被强制回收<br /> 强制回收:所有案件都会回收,留案案件会被强制回收<br />
...@@ -47,7 +122,7 @@ ...@@ -47,7 +122,7 @@
</template> </template>
<script setup name="case-allocation" lang="jsx"> <script setup name="case-allocation" lang="jsx">
import { getLoantotal, getLoanpage, back, fullBack } from '@/api/allcation'; import { getLoantotal, getLoanpage, getLoanDistribute, 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 { VxeTextEllipsis, VxeTooltip } from 'vxe-pc-ui';
...@@ -80,6 +155,7 @@ ...@@ -80,6 +155,7 @@
selectdList.value = row.records; selectdList.value = row.records;
}; };
const statisis = ref({}); const statisis = ref({});
const statisis1 = ref({});
const getStatisis = (params) => { const getStatisis = (params) => {
getLoantotal(params).then((res) => { getLoantotal(params).then((res) => {
if (res.success) { if (res.success) {
...@@ -87,6 +163,19 @@ ...@@ -87,6 +163,19 @@
} }
}); });
}; };
const getStatisis1 = (params, id) => {
const p = JSON.parse(JSON.stringify(params));
if (id) {
p['tenantId'] = id;
}
delete p['current'];
delete p['size'];
getLoanDistribute(p).then((res) => {
if (res.success) {
statisis1.value = res.result;
}
});
};
const backCase = async () => { const backCase = async () => {
if (dataValue.value === '对选中项操作' && (!selectdList.value || !selectdList.value.length)) { if (dataValue.value === '对选中项操作' && (!selectdList.value || !selectdList.value.length)) {
return ElMessage.warning({ return ElMessage.warning({
...@@ -94,6 +183,13 @@ ...@@ -94,6 +183,13 @@
plain: true, plain: true,
}); });
} }
let p = {}
if (dataValue.value === '对选中项操作') {
p['loanIds'] = selectdList.value.map((v) => v.id);
} else {
p = curParam.value;
}
getStatisis1(p);
showModal.value = true; showModal.value = true;
}; };
const submitForm = async (type) => { const submitForm = async (type) => {
...@@ -144,7 +240,7 @@ ...@@ -144,7 +240,7 @@
delete obj['tenantTime']; delete obj['tenantTime'];
} }
curParam.value = obj; curParam.value = obj;
// getStatisis(obj); getStatisis(obj);
return obj; return obj;
}; };
const onCheckboxAll = (flag) => { const onCheckboxAll = (flag) => {
...@@ -372,7 +468,7 @@ ...@@ -372,7 +468,7 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
enum: CaseStatus, enum: CaseStatus,
// search: { el: 'select', props: { filterable: true }, labelWidth: 90 }, search: { el: 'select', props: { filterable: true }, labelWidth: 105 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
...@@ -539,3 +635,33 @@ ...@@ -539,3 +635,33 @@
query(); query();
}); });
</script> </script>
<style lang="scss" scoped>
.top {
display: flex;
.number-box {
font-size: 15px;
width: 235px;
padding: 5px 0 5px 15px;
border: 1px solid rgba(0, 0, 0, 0.1);
height: 50px;
display: flex;
margin-right: 10px;
margin-top: 10px;
}
.icon-wrapper {
width: 40px;
height: 40px;
text-align: center;
line-height: 40px;
color: #bbc3ca;
margin-right: 10px;
font-size: 37px;
}
}
.number-right {
p:nth-child(1) {
color: #aaa;
font-size: 13px;
}
}
</style>
\ No newline at end of file
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
> >
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item class="w-full" label="跟进时间:" prop="name"> <el-form-item class="w-full" label="跟进时间:" prop="trackTime">
<el-date-picker <el-date-picker
v-model="form.trackTime" v-model="form.trackTime"
class="w-full" class="w-full"
...@@ -97,6 +97,7 @@ ...@@ -97,6 +97,7 @@
class="w-full" class="w-full"
style="display: block" style="display: block"
label="跟进结果:" label="跟进结果:"
required
prop="name" prop="name"
label-position="top" label-position="top"
> >
...@@ -121,7 +122,7 @@ ...@@ -121,7 +122,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item class="w-full" style="display: block" label="跟进状态:" prop="code"> <el-form-item class="w-full" style="display: block" label="跟进状态:" prop="code" required>
<el-button <el-button
size="small" size="small"
style="margin-left: 0" style="margin-left: 0"
...@@ -136,7 +137,7 @@ ...@@ -136,7 +137,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item class="w-full" label="跟进备注:" prop="code" style="display: block"> <el-form-item class="w-full" label="跟进备注:" prop="remark" style="display: block">
<el-input <el-input
v-model="form.remark" v-model="form.remark"
class="w-full" class="w-full"
...@@ -261,6 +262,10 @@ ...@@ -261,6 +262,10 @@
const props = defineProps({ const props = defineProps({
mergerCase: String, mergerCase: String,
}); });
const rules = ref({
trackTime: { required: true, message: '请选择跟进时间', trigger: 'blur' },
remark: { required: true, message: '请输入跟进备注', trigger: 'blur' }
});
const tabObj = [ const tabObj = [
{ {
label: '本人可联', label: '本人可联',
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
:action="url" :action="url"
:headers="{timeout:180000}" :headers="{timeout:180000}"
list-type="picture-card" list-type="picture-card"
v-model:file-list="form.images"
ref="mypictureRef" ref="mypictureRef"
class="mypicture" class="mypicture"
:on-preview="handlePictureCardPreview" :on-preview="handlePictureCardPreview"
...@@ -61,6 +62,32 @@ ...@@ -61,6 +62,32 @@
<el-icon><Plus /></el-icon> <el-icon><Plus /></el-icon>
<div>附件</div> <div>附件</div>
</div> </div>
<template #file="{ file }">
<img
class="el-upload-list__item-thumbnail"
:src="updataIf(file) ? getImageUrl() :file.url"
alt=""
>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-delete"
>
<el-icon @click="handleRemove1(file)">
<Delete />
</el-icon>
</span>
<span
class="el-upload-list__item-preview"
>
<el-icon v-if="updataIf(file)" @click="download(file.response.message)">
<Download />
</el-icon>
<el-icon v-else @click="handlePictureCardPreview(file)">
<ZoomIn />
</el-icon>
</span>
</span>
</template>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -99,11 +126,13 @@ ...@@ -99,11 +126,13 @@
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { saveReduce } from '@/api/property'; import { saveReduce } from '@/api/property';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { Download, ZoomIn } from '@element-plus/icons-vue';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { watch } from 'vue'; import { watch } from 'vue';
import Decimal from 'decimal.js'; import Decimal from 'decimal.js';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
import { inject } from 'vue';
const envs = getAppEnvConfig(); const envs = getAppEnvConfig();
const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus"); const { PhoneResultStatus, ReduceType, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","ReduceType", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus");
const emits = defineEmits(['success']); const emits = defineEmits(['success']);
...@@ -114,6 +143,7 @@ ...@@ -114,6 +143,7 @@
const mypictureRef = ref(); const mypictureRef = ref();
const dialogImageUrl = ref(''); const dialogImageUrl = ref('');
const dialogVisible = ref(false); const dialogVisible = ref(false);
const downloadfile = inject('download');
const form = reactive({ const form = reactive({
totalReduceAmount: 0, totalReduceAmount: 0,
totalNumber: '', totalNumber: '',
...@@ -144,16 +174,40 @@ ...@@ -144,16 +174,40 @@
dialogImageUrl.value = uploadFile.url; dialogImageUrl.value = uploadFile.url;
dialogVisible.value = true; dialogVisible.value = true;
}; };
const handleRemove1 = (uploadFile, uploadFiles) => { // 判断文件类型,图片预览,文件下载
const updataIf = (e) => {
console.log('eeee', e)
if (e.fileName) {
if (e.fileName.split('.')[1] === 'png' || e.fileName.split('.')[1] === 'jpeg' || e.fileName.split('.')[1] === 'jpg') {
return false
} else {
return true
}
} else {
if (e.name.split('.')[1] === 'png' || e.name.split('.')[1] === 'jpeg' || e.name.split('.')[1] === 'jpg') {
return false
} else {
return true
}
}
}
const handleRemove1 = (uploadFile) => {
const index = form.images.findIndex((v) => v.name === uploadFile.name); const index = form.images.findIndex((v) => v.name === uploadFile.name);
form.images.splice(index, 1); form.images.splice(index, 1);
}; };
const download = (item) => {
const name = item.slice(item.lastIndexOf('/') + 1, item.length);
downloadfile('/sys/static/' + item, {}, name);
};
const handleFileSuccess1 = (response, file, fileList) => { const handleFileSuccess1 = (response, file, fileList) => {
form.images.push({ if (file.uid) {
url: response.message, const item = form.images.find((v) => v.uid === file.uid);
name: file.name, item.url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + response.message;
}); }
}; };
const getImageUrl = () => {
return new URL(`@/assets/images/file.svg`, import.meta.url).href;
}
const onCheckboxAll = (flag) => { const onCheckboxAll = (flag) => {
if (flag.checked) { if (flag.checked) {
selectdList.value = flag.records; selectdList.value = flag.records;
...@@ -299,12 +353,16 @@ ...@@ -299,12 +353,16 @@
list.forEach((item) => { list.forEach((item) => {
delete item.payAmount; delete item.payAmount;
}); });
let images = form.images.map((v) => v.url)
images = images.map((v) => {
return v.replace(envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/', '');
});
const params = { const params = {
borrower: currentDetail.value.borrower, borrower: currentDetail.value.borrower,
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, images: images.length > 0 ? images : null,
reduceRecords: list, reduceRecords: list,
}; };
console.log('sadas', params); console.log('sadas', params);
......
...@@ -99,6 +99,7 @@ ...@@ -99,6 +99,7 @@
:action="url" :action="url"
:headers="{timeout:180000}" :headers="{timeout:180000}"
list-type="picture-card" list-type="picture-card"
v-model:file-list="form.images"
ref="mypictureRef" ref="mypictureRef"
class="mypicture" class="mypicture"
:on-preview="handlePictureCardPreview" :on-preview="handlePictureCardPreview"
...@@ -109,6 +110,32 @@ ...@@ -109,6 +110,32 @@
<el-icon><Plus /></el-icon> <el-icon><Plus /></el-icon>
<div>附件</div> <div>附件</div>
</div> </div>
<template #file="{ file }">
<img
class="el-upload-list__item-thumbnail"
:src="updataIf(file) ? getImageUrl() :file.url"
alt=""
>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-delete"
>
<el-icon @click="handleRemove1(file)">
<Delete />
</el-icon>
</span>
<span
class="el-upload-list__item-preview"
>
<el-icon v-if="updataIf(file)" @click="download(file.response.message)">
<Download />
</el-icon>
<el-icon v-else @click="handlePictureCardPreview(file)">
<ZoomIn />
</el-icon>
</span>
</span>
</template>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -155,8 +182,10 @@ ...@@ -155,8 +182,10 @@
import { savebyStages } from '@/api/property'; import { savebyStages } from '@/api/property';
import { getByIdPlatforms } from '@/api/platform'; import { getByIdPlatforms } from '@/api/platform';
import { getAppEnvConfig } from '@/utils/env'; import { getAppEnvConfig } from '@/utils/env';
import { Download, ZoomIn, Delete } from '@element-plus/icons-vue';
import Decimal from 'decimal.js'; import Decimal from 'decimal.js';
import { useDict } from '@/hooks/useDict'; import { useDict } from '@/hooks/useDict';
import { inject } from 'vue';
const { PhoneResultStatus, RepayStatus, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","RepayStatus", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus"); const { PhoneResultStatus, RepayStatus, FlowStatus, FollowStatus, AuditStatus, CaseStatus } = useDict("PhoneResultStatus","RepayStatus", "FlowStatus", "FollowStatus","AuditStatus", "CaseStatus");
const envs = getAppEnvConfig(); const envs = getAppEnvConfig();
const url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/upload'; const url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/upload';
...@@ -168,6 +197,7 @@ ...@@ -168,6 +197,7 @@
const splitdata = ref([]); const splitdata = ref([]);
const dialogImageUrl = ref(''); const dialogImageUrl = ref('');
const dialogVisible = ref(false); const dialogVisible = ref(false);
const downloadfile = inject('download');
const form = reactive({ const form = reactive({
remainingAmount: 0, remainingAmount: 0,
images: [], images: [],
...@@ -185,7 +215,29 @@ ...@@ -185,7 +215,29 @@
const onHide = (done) => { const onHide = (done) => {
done(); done();
}; };
const download = (item) => {
const name = item.slice(item.lastIndexOf('/') + 1, item.length);
downloadfile('/sys/static/' + item, {}, name);
};
const getImageUrl = () => {
return new URL(`@/assets/images/file.svg`, import.meta.url).href;
}
const updataIf = (e) => {
console.log('eeee', e)
if (e.fileName) {
if (e.fileName.split('.')[1] === 'png' || e.fileName.split('.')[1] === 'jpeg' || e.fileName.split('.')[1] === 'jpg') {
return false
} else {
return true
}
} else {
if (e.name.split('.')[1] === 'png' || e.name.split('.')[1] === 'jpeg' || e.name.split('.')[1] === 'jpg') {
return false
} else {
return true
}
}
}
const editOrConfirm = () => { const editOrConfirm = () => {
if (editFirst.value) { if (editFirst.value) {
if (!splitdata.value[0].applyAmount || isNaN(Number(splitdata.value[0].applyAmount))) if (!splitdata.value[0].applyAmount || isNaN(Number(splitdata.value[0].applyAmount)))
...@@ -228,12 +280,13 @@ ...@@ -228,12 +280,13 @@
editFirst.value = !editFirst.value; editFirst.value = !editFirst.value;
}; };
const handleFileSuccess1 = (response, file, fileList) => { const handleFileSuccess1 = (response, file, fileList) => {
form.images.push({ if (file.uid) {
url: response.message, const item = form.images.find((v) => v.uid === file.uid);
name: file.name, item.url = envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/' + response.message;
}); }
}; };
const handleRemove1 = (uploadFile, uploadFiles) => { const handleRemove1 = (uploadFile, uploadFiles) => {
console.log('uploadFile', uploadFile)
const index = form.images.findIndex((v) => v.name === uploadFile.name); const index = form.images.findIndex((v) => v.name === uploadFile.name);
form.images.splice(index, 1); form.images.splice(index, 1);
}; };
...@@ -463,10 +516,14 @@ ...@@ -463,10 +516,14 @@
message: '分期金额要大于借款平台的分期最低金额', message: '分期金额要大于借款平台的分期最低金额',
plain: true, plain: true,
}); });
let images = form.images.map((v) => v.url)
images = images.map((v) => {
return v.replace(envs.VITE_GLOB_API_URL_PREFIX + '/sys/static/', '');
});
const params = { const params = {
...currentDetail.value, ...currentDetail.value,
...form, ...form,
images: form.images.map((v) => v.url)?.length > 0 ? form.images.map((v) => v.url) : null, images: images.length > 0 ? images : null,
byStagesRecords: splitdata.value, byStagesRecords: splitdata.value,
loans: selectdList.value, loans: selectdList.value,
flowStatus: 'pending', flowStatus: 'pending',
......
...@@ -1083,11 +1083,11 @@ ...@@ -1083,11 +1083,11 @@
if (row.images && row.images.length > 0) { if (row.images && row.images.length > 0) {
return ( return (
<> <>
<div className="flex justify-center"> {row.images.map((item, index) => (
<ElButton onClick={() => preview(row, 'images')} link type="primary"> <el-icon>
查看 <Download onClick={() => download(item)} />
</ElButton> </el-icon>
</div> ))}
</> </>
); );
} }
...@@ -1276,11 +1276,11 @@ ...@@ -1276,11 +1276,11 @@
if (row.images && row.images.length > 0) { if (row.images && row.images.length > 0) {
return ( return (
<> <>
<div className="flex justify-center"> {row.images.map((item, index) => (
<ElButton onClick={() => preview(row, 'images')} link type="primary"> <el-icon>
查看 <Download onClick={() => download(item)} />
</ElButton> </el-icon>
</div> ))}
</> </>
); );
} }
......
...@@ -2,6 +2,46 @@ ...@@ -2,6 +2,46 @@
<div class="table-box"> <div class="table-box">
<div> <div>
<ProTable :config="config" ref="caseLRef" :api="getLoanpage" :paramCallback="paramCallback" :selectdList="selectdList"> <ProTable :config="config" ref="caseLRef" :api="getLoanpage" :paramCallback="paramCallback" :selectdList="selectdList">
<template #table_top>
<div class="style-lable" style="width: 100%">
<div class="item_warp" style="width: 19%">
<div class="img_warp">
<img src="@/assets/images/caselist.svg" />
</div>
<div class="title_warp">
<div class="items">在派案件数量</div>
<div class="item items1">{{statisis.caseNum}}</div>
</div>
</div>
<div class="item_warp" style="width: 19%">
<div class="img_warp">
<img src="@/assets/images/userlist.svg" />
</div>
<div class="title_warp">
<div class="items">在派案人人数</div>
<div class="item items1">{{statisis.cpeNum}}</div>
</div>
</div>
<div class="item_warp" style="width: 19%">
<div class="img_warp">
<img src="@/assets/images/money.svg" />
</div>
<div class="title_warp">
<div class="items">在派委案金额</div>
<div class="item items1">{{statisis.amount}}</div>
</div>
</div>
<div class="item_warp" style="width: 19%">
<div class="img_warp">
<img src="@/assets/images/tocrash.svg" />
</div>
<div class="title_warp">
<div class="items">待还金额</div>
<div class="item items1">{{statisis.amount}}</div>
</div>
</div>
</div>
</template>
<!-- 表格 header 按钮 --> <!-- 表格 header 按钮 -->
<template #left_buttons> <template #left_buttons>
<div class="flex rounded w-full h-11 items-center pl-2 btn-grp mb-1"> <div class="flex rounded w-full h-11 items-center pl-2 btn-grp mb-1">
...@@ -135,7 +175,7 @@ ...@@ -135,7 +175,7 @@
delete obj['tenantTime']; delete obj['tenantTime'];
} }
curParam.value = obj; curParam.value = obj;
// getStatisis(obj); getStatisis(obj);
return obj; return obj;
}; };
const backCase = async () => { const backCase = async () => {
...@@ -371,7 +411,7 @@ ...@@ -371,7 +411,7 @@
showOverflow: 'tooltip', showOverflow: 'tooltip',
width: 80, width: 80,
enum: CaseStatus, enum: CaseStatus,
// search: { el: 'select', props: { filterable: true }, labelWidth: 90 }, search: { el: 'select', props: { filterable: true }, labelWidth: 105 },
fieldNames: { label: 'label', value: 'value' }, fieldNames: { label: 'label', value: 'value' },
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
:auto-upload="true" :auto-upload="true"
:on-progress="uploadVideoProcess" :on-progress="uploadVideoProcess"
> >
<el-button type="primary" plain :icon="Upload">上传文件</el-button> <el-button type="primary" plain :icon="Upload" :loading="upload.isUploading">上传文件</el-button>
</el-upload> </el-upload>
<!-- 进度条 --> <!-- 进度条 -->
<!-- <el-progress v-if="progressFlag" :percentage="loadProgress" /> --> <!-- <el-progress v-if="progressFlag" :percentage="loadProgress" /> -->
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
<div class="w-full flex items-center justify-center pt-5"> <div class="w-full flex items-center justify-center pt-5">
<div> <div>
<div class="flex items-center"> <div class="flex items-center">
<el-button type="danger" @click="checkData" :disabled="!form.path">检查</el-button> <el-button type="danger" @click="checkData" :disabled="!form.path" :loading="checkObj.checkloading">检查</el-button>
</div> </div>
<div class="text-sm mt-2"> <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>
...@@ -107,6 +107,7 @@ ...@@ -107,6 +107,7 @@
<el-button <el-button
type="primary" type="primary"
@click="submitData" @click="submitData"
:loading="checkObj.submitloading"
:disabled="!form.path || !checkObj.checksuccess" :disabled="!form.path || !checkObj.checksuccess"
>上传</el-button >上传</el-button
> >
...@@ -183,6 +184,8 @@ ...@@ -183,6 +184,8 @@
const uploadRef = ref(); const uploadRef = ref();
const isFold = ref(true); const isFold = ref(true);
const checkObj = reactive({ const checkObj = reactive({
submitloading: false,
checkloading: false,
check: false, check: false,
checksuccess: false, checksuccess: false,
result: { result: {
...@@ -331,6 +334,7 @@ ...@@ -331,6 +334,7 @@
downloadfile('/LoanExcel/downloadTemplate', {}, '模版.xls'); downloadfile('/LoanExcel/downloadTemplate', {}, '模版.xls');
}; };
const checkData = () => { const checkData = () => {
checkObj.checkloading = true
checkLoanExcel({ checkLoanExcel({
fileUrl: form.path, fileUrl: form.path,
}).then((res) => { }).then((res) => {
...@@ -343,6 +347,9 @@ ...@@ -343,6 +347,9 @@
checkObj.result.loanErrors = res.result.loanErrors; checkObj.result.loanErrors = res.result.loanErrors;
checkObj.check = true; checkObj.check = true;
} }
checkObj.checkloading = false
}).catch(e => {
checkObj.checkloading = false
}); });
}; };
...@@ -383,6 +390,7 @@ ...@@ -383,6 +390,7 @@
message: '分期最大期数必填', message: '分期最大期数必填',
plain: true, plain: true,
}); });
checkObj.submitloading = true
// if (!form.minAmount) return ElMessage.warning({ // if (!form.minAmount) return ElMessage.warning({
// message: '最低分期金额必填', // message: '最低分期金额必填',
// plain: true, // plain: true,
...@@ -409,8 +417,11 @@ ...@@ -409,8 +417,11 @@
form['minAmount'] = ''; form['minAmount'] = '';
form['mergerCase'] = 'N'; form['mergerCase'] = 'N';
form['discount'] = ''; form['discount'] = '';
checkObj.submitloading = false
}); });
} catch {} } catch {
checkObj.submitloading = false
}
}; };
onMounted(() => { onMounted(() => {
formRef.value.clearValidate(); formRef.value.clearValidate();
......
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