Commit 7666d690 authored by 沈翠玲's avatar 沈翠玲

案件回收

parent 07c39038
...@@ -28,6 +28,14 @@ export const changeDistributeCpe = (data) => { ...@@ -28,6 +28,14 @@ export const changeDistributeCpe = (data) => {
return request.post(`/LoanDistribute/changeDistributeCpe`, data); return request.post(`/LoanDistribute/changeDistributeCpe`, data);
}; };
// 撤回案件 // 撤回案件
export const backDistribute = (ids) => { // export const backDistribute = (ids) => {
return request.get('/LoanDistribute/back', { ids }); // return request.get('/LoanDistribute/back', { ids });
// };
// 撤案
export const withdraw = (ids) => {
return request.get('/LoanDistribute/withdraw', { ids });
};
// 撤回案件
export const fullWithdraw = (ids) => {
return request.get('/LoanDistribute/fullWithdraw', { ids });
}; };
...@@ -244,6 +244,7 @@ ...@@ -244,6 +244,7 @@
param['loanIds'] = lonsArr.value.map(v => v.id) param['loanIds'] = lonsArr.value.map(v => v.id)
} else { } else {
param['borrowerName'] = pageParams.value.borrowerName param['borrowerName'] = pageParams.value.borrowerName
param['batchCode'] = pageParams.value.batchCode
param['borrowerIdCard'] = pageParams.value.idCard param['borrowerIdCard'] = pageParams.value.idCard
param['borrowerPhone'] = pageParams.value.borrowerPhone param['borrowerPhone'] = pageParams.value.borrowerPhone
param['commissionAmount'] = pageParams.value.commissionAmount param['commissionAmount'] = pageParams.value.commissionAmount
...@@ -344,6 +345,7 @@ ...@@ -344,6 +345,7 @@
// chooseIdea('BORROWER'); // chooseIdea('BORROWER');
distributeLoan(currentTenant.value, { distributeLoan(currentTenant.value, {
borrowerName: pageParams.value.borrowerName, borrowerName: pageParams.value.borrowerName,
batchCode: pageParams.value.batchCode,
borrowerIdCard: pageParams.value.idCard, borrowerIdCard: pageParams.value.idCard,
borrowerPhone: pageParams.value.borrowerPhone, borrowerPhone: pageParams.value.borrowerPhone,
commissionAmount: pageParams.value.commissionAmount, commissionAmount: pageParams.value.commissionAmount,
......
...@@ -153,6 +153,12 @@ ...@@ -153,6 +153,12 @@
width: 100, width: 100,
search: { el: 'input', props: { clearable: true }, key: 'manageOrg', labelWidth: 78 }, search: { el: 'input', props: { clearable: true }, key: 'manageOrg', labelWidth: 78 },
}, },
{
field: 'batchCode',
title: '导入批次',
width: 100,
search: { el: 'input', props: { clearable: true }, key: 'batchCode', labelWidth: 78 },
},
{ {
field: 'distributeStatus', field: 'distributeStatus',
title: '分派状态', title: '分派状态',
......
<template>
<vxe-modal
v-model="showModal"
title="案件分派"
@hide="onHide"
height="582"
width="1003"
show-footer
esc-closable
>
<div class="allocation-wrap">
<div class="Content">
<div class="top">
<div class="number-box">
<div class="number-left">
<div class="icon-wrapper">
<el-icon><UserFilled size="850" /></el-icon>
</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">
<el-icon><List /></el-icon>
</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">
<el-icon><UserFilled size="850" /></el-icon>
</div>
</div>
<div class="number-right">
<p>待分派金额</p>
<p>{{ statisis.unAmount }}</p>
</div>
</div>
</div>
<div style="margin-top: 10px; margin-bottom: 10px">
<el-radio-group v-model="radio" @change="changeRadio">
<el-radio :value="0">分派到调解中心</el-radio>
<el-radio :value="1">分派到CPE</el-radio>
</el-radio-group>
</div>
<template v-if="radio === 0 || (radio === 1 && !step)">
<div class="mainContent">
<div class="flex items-center my-3">
<span class="mr-2" v-if="radio === 0">
调解中心
</span>
<el-select
v-if="radio === 0"
v-model="currentTenant"
placeholder="请选择调解中心"
style="width: 210px"
@change="handleNodeClick"
>
<el-option
:label="item.name"
:value="item.id"
v-for="(item, index) in data"
:key="index"
/>
</el-select>
<div v-else class="flex">
<div class="tree-cpe">
<p class="bb">选择CPE</p>
<div class="flex">
<div class="tree-wrapper" style="border-right: none">
<el-tree :data="data" highlight-current :props="defaultProps" @node-click="handleNodeClick" />
</div>
<div class="tree-wrapper">
<div class="flex items-center h-10 border-b">
<div class=" px-3 border-r mr-auto h-full flex items-center justify-center">
<el-checkbox v-model="checked1" label="" @change="changeAll"/>
</div>
<div class="flex-1 text-center">CPE</div></div>
<el-tree :data="alltabledata" highlight-current ref="allTreeRef" node-key="id" show-checkbox :props="{
children: 'children',
label: 'username',
}" @check-change="checkChange"/>
</div>
</div>
</div>
<div class="ml-3">
<p class="bb">已选CPE</p>
<div class="flex items-center h-10 border border-b-0">
<div class=" w-10 border-r mr-auto h-full flex items-center justify-center">
序号
</div>
<div class="flex-1 text-center">CPE</div>
</div>
<div class="tree-wrapper" style="height: calc(100% - 3.8rem);">
<div v-for="(item, index) in tabledata" :key="index" class="flex">
<div class=" w-10 mr-auto h-full flex items-center justify-center">
{{index+1}}
</div>
<div class="flex-1 text-left pl-3">{{ item.cpe.username }}</div>
</div>
</div>
</div>
</div>
</div>
<!-- <el-transfer
v-model="value1"
:data="data1"
:titles="['CPE', '已选CPE']"
ref="mytransfer"
@left-check-change="leftChange"
/> -->
</div>
</template>
<template v-if="radio === 1 && currentTenant && step">
<p class="my-2">分派方案</p>
<div class="idea-box">
<div class="left-idea">
<div class="idea-btn">
<el-button
type="primary"
:plain="currentAllBtn === item.value ? false : true"
v-for="(item, index) in options"
:key="index"
@click="chooseIdea(item.value)"
>{{ item.label }}</el-button
>
</div>
<div class="reset-btn">
<el-button type="primary" link :icon="RefreshRight" @click="resetAllocation"
>重新分派</el-button
>
</div>
</div>
<div class="right-idea">
<ProTable
:config="config"
:data="tabledata"
ref="caseLRef"
:showPagination="false"
:showToolBar="false"
/>
</div>
</div>
</template>
</div>
</div>
<template #footer>
<el-button @click="backform" v-if="step" style="float: left">上一步</el-button>
<el-button type="primary" @click="saveFrom" :disabled="!currentTenant" v-if="radio === 1 && step"
>保存</el-button
>
<el-button type="default" @click="showModal = false">取消</el-button>
<el-button
type="primary"
@click="submitForm"
v-if="radio ===0||step"
:disabled="!currentTenant || (radio === 1 && !SaveBol)"
>确认提交</el-button
>
<el-button type="primary" @click="submitForm" v-if="!step && radio === 1" :disabled="!currentTenant">下一步</el-button>
</template>
</vxe-modal>
</template>
<script setup lang="jsx" name="allocationModal">
import { UserFilled } from '@element-plus/icons-vue';
import { RefreshRight } from '@element-plus/icons-vue';
import { ElInputNumber, ElMessage } from 'element-plus';
import {
getLoanDistribute,
distributeLoan,
confirm,
distributeCpe,
changeDistributeCpe,
} from '@/api/allcation';
import { getTenantPage } from '@/api/tenant';
import { computed } from 'vue';
import { reactive, ref, nextTick } from 'vue';
const emits = defineEmits(['success']);
const data = ref([]);
const mytransfer = ref();
const tabledata = ref([]);
const alltabledata = ref([]);
const lonsArr = ref([]);
const SaveBol = ref(false);
const showModal = ref(false);
const currentTenant = ref();
const allTreeRef = ref();
const statisis = ref({});
const currentAllBtn = ref();
const checked1 = ref(false)
const editRowIndex = ref(-1);
const pageParams = ref({});
const radio = ref(null);
const step = ref(0);
const searchParam = ref();
const onHide = () => {};
const getStatisis = (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) {
statisis.value = res.result;
}
});
};
const getTree = () => {
getTenantPage({
current: 1,
size: 999999999,
}).then((res) => {
if (res.success) {
data.value = res.result.content;
}
});
};
const chooseIdea = (type) => {
editRowIndex.value = -1;
currentAllBtn.value = type;
const param = {
type: currentAllBtn.value,
tenantId: currentTenant.value,
}
if (tabledata.value && tabledata.value.length) {
param['cpeIds'] = tabledata.value.map(v => v.cpe.id)
}
if (lonsArr.value && lonsArr.value.length) {
param['loanIds'] = lonsArr.value.map(v => v.id)
} else {
param['borrowerName'] = pageParams.value.borrowerName
param['borrowerIdCard'] = pageParams.value.idCard
param['borrowerPhone'] = pageParams.value.borrowerPhone
param['commissionAmount'] = pageParams.value.commissionAmount
param['remainingAmount'] = pageParams.value.remainingAmount
}
distributeCpe(param).then((res) => {
if (res.success) {
tabledata.value = res.result;
}
});
};
const changeRadio = () => {
radio.value === 0 && getStatisis(pageParams.value);
step.value = 0
currentTenant.value = null;
};
const openModal = (param, select) => {
console.log('select', select)
lonsArr.value = select
showModal.value = true;
pageParams.value = param;
currentAllBtn.value = null;
getTree();
step.value = 0;
radio.value = 0
SaveBol.value = false;
currentTenant.value = null;
editRowIndex.value = -1;
tabledata.value = []
alltabledata.value = []
checked1.value = false
};
const changeAll = () => {
if (checked1.value) {
allTreeRef.value.setCheckedNodes(alltabledata.value)
} else {
allTreeRef.value.setCheckedKeys([])
}
}
const backform = () => {
step.value = 0;
};
const saveFrom = () => {
if (currentAllBtn.value === 'CASE') {
const sum = tabledata.value.reduce((pre, cur) => pre + cur.caseNum, 0);
if (Number(sum) !== Number(statisis.value.unCaseNum))
return ElMessage.warning({
message: '总数与待分派案件数不一致',
plain: true,
});
} else if (currentAllBtn.value === 'BORROWER') {
const sum = tabledata.value.reduce((pre, cur) => pre + cur.borrowerNum, 0);
if (Number(sum) !== Number(statisis.value.unCustomerNum))
return ElMessage.warning({
message: '总数与待分派案人数不一致',
plain: true,
});
}
changeDistributeCpe({
records: tabledata.value,
distributeType: currentAllBtn.value,
}).then((res) => {
if (res.success) {
ElMessage.success({
message: '保存成功',
plain: true,
});
SaveBol.value = true;
}
});
};
const submitForm = () => {
if (radio.value === 1) {
if (step.value){
if (!SaveBol.value)
ElMessage.warning({
message: '要先保存',
plain: true,
});
confirm({
records: tabledata.value,
distributeType: currentAllBtn.value,
}).then((res) => {
if (res.success) {
ElMessage.success({
message: '分派成功',
plain: true,
});
showModal.value = false;
emits('success');
}
});
} else {
step.value = 1;
}
} else if (radio.value === 0) {
// chooseIdea('BORROWER');
distributeLoan(currentTenant.value, {
borrowerName: pageParams.value.borrowerName,
borrowerIdCard: pageParams.value.idCard,
borrowerPhone: pageParams.value.borrowerPhone,
commissionAmount: pageParams.value.commissionAmount,
remainingAmount: pageParams.value.remainingAmount,
tenantId: null,
}).then((res) => {
if (res.success) {
ElMessage.success({
message: '分派成功',
plain: true,
});
showModal.value = false;
emits('success');
}
});
}
};
const handleNodeClick = (data1) => {
if(typeof data1 === 'object') {
currentTenant.value = data1.id
let param = {}
if (lonsArr.value && lonsArr.value.length) {
param['loanIds'] = lonsArr.value.map(v => v.id)
} else {
param = {...pageParams.value}
}
getStatisis(param, currentTenant.value);
tabledata.value = data1.users.map((v) => ({
cpe: v,
borrowerNum: null,
caseNum: null,
amount: null,
}));
alltabledata.value = data1.users
checked1.value = true
console.log('allTreeRef', data1.users)
console.log('allTreeRef.value', allTreeRef.value)
nextTick(() => {
setTimeout(() => {
allTreeRef.value.setCheckedNodes(data1.users)
});
});
}
};
const resetAllocation = () => {
chooseIdea(currentAllBtn.value);
};
const checkChange = (dara, ddd, aaa) => {
nextTick(() => {
const arr = allTreeRef.value.getCheckedNodes()
tabledata.value = arr.map((v) => ({
cpe: v,
borrowerNum: null,
caseNum: null,
amount: null,
}));
});
}
const changeNum = (type, row, index) => {
// editRowIndex.value = index;
console.log('changeNum', type, row, index);
};
const leftChange = (value, direction) => {
console.log(value, direction); //这个就是它包含的所有的属性以及事件,如果需要别的操作直接执行,也可以查询到
};
const options = [
{
label: '以案人数均分',
value: 'BORROWER',
},
{
label: '以案件数均分',
value: 'CASE',
},
{
label: '以委案金额均分',
value: 'AMOUNT',
},
];
const config = computed(() => {
// 去除分页控件,toolbar控件
return {
toolbarConfig: { enabled: false },
columns: [
{ type: 'seq', width: 50, title: '序号' },
{
field: 'cpe.username',
title: 'CPE',
},
{
field: 'borrowerNum',
title: '分派案人数',
slots: {
default: ({ row, rowIndex }) => {
if (currentAllBtn.value === 'BORROWER') {
return (
<>
<ElInputNumber
v-model={row.borrowerNum}
onChange={() => changeNum(1, row, rowIndex)}
disabled={editRowIndex.value > -1 && editRowIndex.value !== rowIndex}
/>
</>
);
} else {
return <>{row.borrowerNum}</>;
}
},
},
},
{
field: 'caseNum',
title: '分派案件数',
slots: {
default: ({ row, rowIndex }) => {
if (currentAllBtn.value === 'CASE') {
return (
<>
<ElInputNumber
v-model={row.caseNum}
onChange={() => changeNum(2, row, rowIndex)}
disabled={editRowIndex.value > -1 && editRowIndex.value !== rowIndex}
/>
</>
);
} else {
return <>{row.caseNum}</>;
}
},
},
},
{
field: 'amount',
title: '分派委案金额',
// slots: {
// default: ({ row, rowIndex }) => {
// // if (currentAllBtn.value === 3) {
// // return (
// // <>
// // <ElInputNumber
// // v-model={row.num}
// // onChange={() => changeNum(3, row, rowIndex)}
// // disabled={editRowIndex.value > -1 && editRowIndex.value !== rowIndex}
// // />
// // </>
// // );
// // } else {
// return <>{row.num}</>;
// // }
// },
// },
},
],
};
});
const generateData = () => {
const data = [];
for (let i = 1; i <= 15; i++) {
data.push({
key: i,
label: `Option ${i}`,
});
}
return data;
};
const data1 = ref(generateData());
const value1 = ref([]);
const defaultProps = {
children: 'children',
label: 'name',
};
defineExpose({
openModal,
});
</script>
<style lang="scss" scoped>
.allocation-wrap {
height: 100%;
.top {
display: flex;
.number-box {
font-size: 15px;
width: 235px;
padding: 5px 0 5px 15px;
border: 1px solid #f1f1f1;
height: 50px;
display: flex;
margin-right: 10px;
margin-top: 10px;
}
.icon-wrapper {
width: 40px;
height: 40px;
text-align: center;
line-height: 40px;
color: #bbc3ca;
border: 2px solid #bbc3ca;
border-radius: 100%;
margin-right: 10px;
font-size: 37px;
}
}
.number-right {
p:nth-child(1) {
color: #cacaca;
font-size: 13px;
}
}
}
.Content {
height: calc(100% - 50px);
.idea-box {
height: calc(100% - 24px);
display: flex;
}
.left-idea {
width: 250px;
border: 1px solid #ebeef5;
display: flex;
flex-direction: column;
}
.right-idea {
width: calc(100% - 250px);
:deep(.card) {
padding: 0;
}
}
.idea-btn {
display: flex;
flex-direction: column;
align-items: center;
border-bottom: 1px solid #ebeef5;
padding-bottom: 10px;
.el-button {
width: 150px;
margin-left: 0 !important;
margin-top: 15px;
}
}
.reset-btn {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
}
}
.mainContent {
display: flex;
.bb {
padding-left: 14px;
border: 1px solid #ebeef5;
border-bottom: none;
}
.tree-wrapper {
border: 1px solid #ebeef5;
width: 290px;
height: 318px;
}
.bc {
display: flex;
}
}
</style>
<template>
<div class="table-box">
<div>
<ProTable :config="config" ref="caseLRef" :api="getLoanpage" :paramCallback="paramCallback">
<!-- 表格 header 按钮 -->
<template #left_buttons>
<el-button
type="primary"
:disabled="!selectdList || selectdList.length < 1"
@click="backCase"
>撤回
</el-button>
<el-button type="primary" :disabled="!selectdList || selectdList.length < 1" @click="fullBackCase"
>撤案
</el-button>
</template>
</ProTable>
</div>
<allocationModal ref="allocationModalRef" @success="query" />
</div>
</template>
<script setup name="case-allocation" lang="jsx">
import allocationModal from './components/allocationModal.vue';
import { getLoantotal, getLoanpage, withdraw, fullWithdraw } from '@/api/allcation';
import { reactive, ref } from 'vue';
import { ElMessageBox, ElMessage } from 'element-plus';
import citydata from '../../../assets/citydata';
import { onMounted } from 'vue';
const allocationModalRef = ref();
const caseLRef = ref();
const selectdList = ref([]);
const curParam = ref({});
const onCheckboxChange = (row) => {
selectdList.value = row.records;
};
const statisis = ref({});
const getStatisis = (params) => {
getLoantotal(params).then((res) => {
if (res.success) {
statisis.value = res.result;
}
});
};
const backCase = async () => {
await ElMessageBox.confirm('是否确认撤回选中案件?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
});
const ids = selectdList.value.map((v) => v.id).join(',');
await withdraw(ids);
ElMessage({
type: 'success',
message: '撤回成功!',
plain: true,
});
query();
};
const fullBackCase = async () => {
await ElMessageBox.confirm('是否确认撤案?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
});
const ids = selectdList.value.map((v) => v.id).join(',');
await fullWithdraw(ids);
ElMessage({
type: 'success',
message: '撤案成功!',
plain: true,
});
query();
}
const paramCallback = (param) => {
const obj = JSON.parse(JSON.stringify(param));
if (obj.arealist && obj.arealist.length > 0) {
obj['province'] = obj.arealist[0];
obj['city'] = obj.arealist.length > 1 ? obj.arealist[1] : null;
obj['district'] = obj.arealist.length > 2 ? obj.arealist[2] : null;
delete obj['arealist'];
}
if (obj['cpeDate']) {
if (obj['cpeDate'][0]) obj['cpeDateBegin'] = obj['cpeDate'][0];
if (obj['cpeDate'][1]) obj['cpeDateEnd'] = obj['cpeDate'][1];
delete obj['cpeDate'];
}
if (obj['tenantTime']) {
if (obj['tenantTime'][0]) obj['tenantTimeBegin'] = obj['tenantTime'][0];
if (obj['tenantTime'][1]) obj['tenantTimeEnd'] = obj['tenantTime'][1];
delete obj['tenantTime'];
}
curParam.value = obj;
// getStatisis(obj);
return obj;
};
const distributeStatusOpt = [
{ label: '未分派', value: 'undistributed' },
{ label: '分派到调解中心', value: 'tenant' },
{ label: '分派到CPE', value: 'CPE' },
];
const onCheckboxAll =(flag)=> {
if (flag.checked) {
selectdList.value = flag.records;
} else {
selectdList.value = [];
}
}
console.log('citydatacitydata', citydata);
const config = reactive({
columns: [
{ type: 'checkbox', title: '', width: 40 },
{
field: 'caseId',
title: '案件ID',
showOverflow: 'tooltip',
search: { el: 'input', labelWidth: 78 },
width: 100,
},
{
field: 'arealist',
enum: citydata,
title: '所属区域',
showOverflow: 'tooltip',
width: 100,
fieldNames: { label: 'label', value: 'value' },
search: { el: 'cascader', props: { clearable: true, checkStrictly: true }, labelWidth: 78 },
slots: {
default: ({ row }) => {
return (
<div>
{row.manageOrg.province}
{row.manageOrg.city ? '-' + row.manageOrg.city : ''}
{row.manageOrg.district ? '-' + row.manageOrg.district : ''}
</div>
);
},
},
},
{
field: 'loanPlatform.name',
title: '借款机构',
width: 100,
search: { el: 'input', props: { clearable: true }, key: 'payOrg', labelWidth: 78 },
},
{
field: 'manageOrg.orgName',
title: '资管公司',
width: 100,
search: { el: 'input', props: { clearable: true }, key: 'manageOrg', labelWidth: 78 },
},
{
field: 'batchCode',
title: '导入批次',
width: 100,
search: { el: 'input', props: { clearable: true }, key: 'batchCode', labelWidth: 78 },
},
{
field: 'distributeStatus',
title: '分派状态',
width: 80,
enum: distributeStatusOpt,
search: { el: 'select', props: { filterable: true }, labelWidth: 78 },
fieldNames: { label: 'label', value: 'value' },
slots: {
default: ({ row }) => {
return (
<>
{row.distributeStatus
? distributeStatusOpt.find((v) => v.value === row.distributeStatus).label
: ''}
</>
);
},
},
},
{
field: 'tenant.name',
title: '调解中心',
width: 80,
search: { el: 'input', props: { clearable: true }, labelWidth: 78 },
},
{
field: 'discount',
title: '折扣',
width: 80,
},
{
field: 'cpe.name',
title: 'CPE',
width: 60,
search: { el: 'input', props: { clearable: true }, key: 'cpeName', labelWidth: 78 },
},
{
field: 'tenantTime',
title: '分派中心日期',
width: 130,
search: {
el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 78,
},
},
{
field: 'commissionAmount',
title: '债权总额',
width: 80,
search: { el: 'input', props: { clearable: true }, labelWidth: 78 },
},
{
field: 'cpeDate',
title: '分派CPE日期',
width: 130,
search: {
el: 'date-picker',
props: { type: 'daterange', valueFormat: 'YYYY-MM-DD' },
labelWidth: 78,
},
},
{
field: 'borrower.name',
title: '借款人姓名',
width: 100,
search: { el: 'input', key: 'borrowerName', props: { clearable: true }, labelWidth: 78 },
},
{
field: 'sumRepayAmount',
title: '已还总额',
width: 80,
search: { el: 'input', props: { clearable: true }, labelWidth: 78 },
},
{
field: 'borrower.idCard',
title: '身份证',
width: 140,
search: { el: 'input', props: { clearable: true }, key: 'idCard', labelWidth: 78 },
},
{
field: 'borrower.phone',
key: 'borrowerPhone',
title: '手机',
width: 100,
search: { el: 'input', props: { clearable: true }, labelWidth: 78 },
},
{
field: 'principalBalance',
title: '剩余本金',
width: 80,
},
{
field: 'remaininginterest',
title: '剩余利息',
width: 80,
},
{
field: 'commission',
title: '违约金',
width: 80,
},
],
onCheckboxChange: onCheckboxChange,
onCheckboxAll: onCheckboxAll
});
const allocation = (row) => {
allocationModalRef.value.openModal(JSON.parse(JSON.stringify(curParam.value)), JSON.parse(JSON.stringify(selectdList.value)));
};
const query = () => caseLRef.value?.search();
onMounted(() => {
query();
});
</script>
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