Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
Y
yishuju-ui
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
何远江
yishuju-ui
Commits
dd518a58
Commit
dd518a58
authored
Feb 10, 2025
by
沈翠玲
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复管理和修复审批
parent
e21e3df8
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
655 additions
and
138 deletions
+655
-138
property.js
src/api/property.js
+13
-0
role.js
src/api/role.js
+4
-0
index.vue
src/views/business-approval/repair-approve/index.vue
+167
-27
index.vue
src/views/property/case-allocation/index.vue
+28
-6
index.vue
src/views/property/case-back/index.vue
+47
-6
repairModal.vue
src/views/property/case-detail/components/repairModal.vue
+40
-28
index.vue
src/views/property/case-return/index.vue
+49
-9
index.vue
src/views/property/import/index.vue
+104
-59
step.svg
src/views/property/import/step.svg
+1
-0
index.vue
src/views/property/repair-manage/index.vue
+164
-3
AccountFormModal.vue
...iews/system/accountManage/components/AccountFormModal.vue
+38
-0
No files found.
src/api/property.js
View file @
dd518a58
...
...
@@ -84,3 +84,16 @@ export const saveTrackRecord = (data) => {
export
const
getTrackRecord
=
(
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
);
};
src/api/role.js
View file @
dd518a58
...
...
@@ -11,3 +11,7 @@ export const getRolePage = (params) => {
export
const
deleteRoles
=
(
ids
)
=>
{
return
request
.
get
(
'/role/batchDeleteByIds'
,
{
ids
});
};
export
const
getDefualtRoles
=
(
params
)
=>
{
return
request
.
get
(
'/role/getDefualtRoles'
,
params
);
};
src/views/business-approval/repair-approve/index.vue
View file @
dd518a58
<
template
>
<div
class=
"table-box"
>
<ProTable
:config=
"config"
:data=
"tabledata"
:showPagination=
"false"
:showToolBar=
"true
"
>
<ProTable
:config=
"config"
ref=
"caseLRef"
:api=
"getRepairRecord
"
>
<template
#
left_buttons
>
<!--
<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>
-->
</
template
>
</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>
</template>
<
script
setup
name=
"systemLog"
lang=
"jsx"
>
import
{
computed
}
from
'vue'
;
import
{
onMounted
}
from
'vue'
;
import
{
reactive
,
ref
}
from
'vue'
;
import
{
getRepairRecord
,
RepairRecordStatusByIds
}
from
'@/api/property'
;
import
{
ElMessageBox
,
ElMessage
,
ElButton
}
from
'element-plus'
;
const
tabledata
=
ref
([]);
const
config
=
computed
(()
=>
{
return
{
columns
:
[
{
type
:
'checkbox'
,
width
:
50
},
{
type
:
'seq'
,
width
:
50
},
{
field
:
'code'
,
title
:
'联系人姓名'
,
search
:
{
el
:
'input'
,
props
:
{
clearable
:
true
}
},
const
showModal
=
ref
(
false
);
const
caseLRef
=
ref
();
const
flowStatusOpt
=
[
{
label
:
'待审核'
,
value
:
'pending'
},
// { label: '审核中', value: 'in_review' },
{
label
:
'通过'
,
value
:
'pass'
},
{
label
:
'未通过'
,
value
:
'fail'
}
];
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
:
'与债权人关系'
,
search
:
{
el
:
'input'
,
props
:
{
clearable
:
true
}
},
},
{
field
:
'newPhone'
,
title
:
'修复后联系方式'
,
showOverflow
:
'tooltip'
,
// width: 140,
search
:
{
el
:
'input'
,
props
:
{
clearable
:
true
},
key
:
'newPhone'
,
labelWidth
:
95
,
},
{
field
:
'code'
,
title
:
'号码类型'
,
search
:
{
el
:
'input'
,
props
:
{
clearable
:
true
}
},
},
{
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
:
''
}
<
/
>
);
},
},
],
};
}
],
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
>
src/views/property/case-allocation/index.vue
View file @
dd518a58
...
...
@@ -44,6 +44,7 @@
import
{
ElMessageBox
,
ElMessage
}
from
'element-plus'
;
import
citydata
from
'../../../assets/citydata'
;
import
{
onMounted
}
from
'vue'
;
import
{
VxeTextEllipsis
,
VxeTooltip
}
from
'vxe-pc-ui'
const
allocationModalRef
=
ref
();
const
caseLRef
=
ref
();
const
selectdList
=
ref
([]);
...
...
@@ -76,6 +77,11 @@
});
query
();
};
const
caseStatusOpt
=
[
{
label
:
'正常'
,
value
:
'normal'
},
{
label
:
'撤案'
,
value
:
'withdraw'
},
{
label
:
'留案'
,
value
:
'stay'
},
];
const
paramCallback
=
(
param
)
=>
{
const
obj
=
JSON
.
parse
(
JSON
.
stringify
(
param
));
if
(
obj
.
arealist
&&
obj
.
arealist
.
length
>
0
)
{
...
...
@@ -126,17 +132,15 @@
enum
:
citydata
,
title
:
'所属区域'
,
showOverflow
:
'tooltip'
,
width
:
1
0
0
,
width
:
1
6
0
,
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
>
<
VxeTooltip
content
=
{
row
.
borrower
.
domicileProvince
+
(
row
.
borrower
.
domicileCity
?
'-'
+
row
.
borrower
.
domicileCity
:
''
)
+
(
row
.
borrower
.
area
?
'-'
+
row
.
borrower
.
area
:
''
)}
>
<
VxeTextEllipsis
content
=
{
row
.
borrower
.
domicileProvince
+
(
row
.
borrower
.
domicileCity
?
'-'
+
row
.
borrower
.
domicileCity
:
''
)
+
(
row
.
borrower
.
area
?
'-'
+
row
.
borrower
.
area
:
''
)}
><
/VxeTextEllipsis
>
<
/VxeTooltip
>
);
},
},
...
...
@@ -278,6 +282,24 @@
title
:
'违约金'
,
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
,
onCheckboxAll
:
onCheckboxAll
...
...
src/views/property/case-back/index.vue
View file @
dd518a58
...
...
@@ -21,7 +21,7 @@
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>
...
...
@@ -36,6 +36,7 @@
import
{
getLoantotal
,
getLoanpage
,
back
,
fullBack
}
from
'@/api/allcation'
;
import
{
reactive
,
ref
}
from
'vue'
;
import
{
ElMessageBox
,
ElMessage
}
from
'element-plus'
;
import
{
VxeTextEllipsis
,
VxeTooltip
}
from
'vxe-pc-ui'
import
citydata
from
'../../../assets/citydata'
;
import
{
onMounted
}
from
'vue'
;
const
caseLRef
=
ref
();
...
...
@@ -53,7 +54,30 @@
}
});
};
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
submitForm
=
async
(
type
)
=>
{
...
...
@@ -117,6 +141,7 @@
selectdList
.
value
=
[];
}
}
console
.
log
(
'citydatacitydata'
,
citydata
);
const
config
=
reactive
({
columns
:
[
...
...
@@ -139,11 +164,9 @@
slots
:
{
default
:
({
row
})
=>
{
return
(
<
div
>
{
row
.
manageOrg
.
province
}
{
row
.
manageOrg
.
city
?
'-'
+
row
.
manageOrg
.
city
:
''
}
{
row
.
manageOrg
.
district
?
'-'
+
row
.
manageOrg
.
district
:
''
}
<
/div
>
<
VxeTooltip
content
=
{
row
.
borrower
.
domicileProvince
+
(
row
.
borrower
.
domicileCity
?
'-'
+
row
.
borrower
.
domicileCity
:
''
)
+
(
row
.
borrower
.
area
?
'-'
+
row
.
borrower
.
area
:
''
)}
>
<
VxeTextEllipsis
content
=
{
row
.
borrower
.
domicileProvince
+
(
row
.
borrower
.
domicileCity
?
'-'
+
row
.
borrower
.
domicileCity
:
''
)
+
(
row
.
borrower
.
area
?
'-'
+
row
.
borrower
.
area
:
''
)}
><
/VxeTextEllipsis
>
<
/VxeTooltip
>
);
},
},
...
...
@@ -285,6 +308,24 @@
showOverflow
:
'tooltip'
,
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
,
onCheckboxAll
:
onCheckboxAll
...
...
src/views/property/case-detail/components/repairModal.vue
View file @
dd518a58
...
...
@@ -3,8 +3,8 @@
v-model=
"showModal"
title=
"修复申请"
@
hide=
"onHide"
height=
"
582
"
width=
"
1003
"
height=
"
350
"
width=
"
800
"
show-footer
esc-closable
>
...
...
@@ -23,16 +23,16 @@
</el-form-item>
</el-col>
<el-col
:span=
"10"
>
<el-form-item
class=
"w-full"
label=
"联系人姓名:"
prop=
"name"
>
<el-input
v-model=
"form.n
ame"
placeholder=
"请输入账号
"
/>
<el-form-item
class=
"w-full"
label=
"联系人姓名:"
prop=
"n
ewN
ame"
>
<el-input
v-model=
"form.n
ewName"
placeholder=
"请输入联系人姓名
"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
class=
"w-full"
label=
"号码类型:"
prop=
"role"
>
修复
</el-form-item>
</el-col>
<el-col
:span=
"10"
>
<el-form-item
class=
"w-full"
label=
"与案人关系:"
prop=
"
relation
"
>
<el-select
v-model=
"form.
relation"
placeholder=
"请选择
"
>
<el-form-item
class=
"w-full"
label=
"与案人关系:"
prop=
"
kinship
"
>
<el-select
v-model=
"form.
kinship"
placeholder=
"请选择关系
"
>
<el-option
v-for=
"item in options"
:key=
"item.value"
...
...
@@ -44,7 +44,7 @@
</el-col>
<el-col
:span=
"12"
>
<el-form-item
class=
"w-full"
label=
"修复前联系号码:"
prop=
"role"
label-width=
"140px"
>
{{
currentDetail
.
peopl
e
}}
{{
currentDetail
?.
borrower
?.
phon
e
}}
</el-form-item>
</el-col>
</el-row>
...
...
@@ -59,6 +59,9 @@
<
script
setup
lang=
"jsx"
name=
"allocationModal"
>
import
{
computed
}
from
'vue'
;
import
{
saveRepairRecord
}
from
'@/api/property'
;
import
{
ElMessage
}
from
'element-plus'
;
import
{
reactive
,
ref
}
from
'vue'
;
const
data
=
ref
([]);
const
mytransfer
=
ref
();
...
...
@@ -67,40 +70,49 @@
const
showModal
=
ref
(
false
);
const
currentDetail
=
ref
({
people
:
0
,
case
:
0
,
money
:
0
});
const
form
=
reactive
({
name
:
''
,
relation
:
''
,
n
ewN
ame
:
''
,
kinship
:
''
,
});
const
onHide
=
()
=>
{
currentDetail
.
value
=
{
people
:
0
,
case
:
0
,
money
:
0
};
};
const
openModal
=
(
account
)
=>
{
console
.
log
(
'currentDetail'
,
currentDetail
.
value
)
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
=
[
{
value
:
'
Option1
'
,
label
:
'
Option1
'
,
value
:
'
本人
'
,
label
:
'
本人
'
,
},
{
value
:
'Option2'
,
label
:
'Option2'
,
},
{
value
:
'Option3'
,
label
:
'Option3'
,
},
{
value
:
'Option4'
,
label
:
'Option4'
,
},
{
value
:
'Option5'
,
label
:
'Option5'
,
},
value
:
'非本人'
,
label
:
'非本人'
,
}
];
const
config
=
computed
(()
=>
{
...
...
src/views/property/case-return/index.vue
View file @
dd518a58
...
...
@@ -21,7 +21,7 @@
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>
...
...
@@ -39,6 +39,7 @@
import
{
ElMessageBox
,
ElMessage
}
from
'element-plus'
;
import
citydata
from
'../../../assets/citydata'
;
import
{
onMounted
}
from
'vue'
;
import
{
VxeTextEllipsis
,
VxeTooltip
}
from
'vxe-pc-ui'
const
caseLRef
=
ref
();
const
selectdList
=
ref
([]);
const
curParam
=
ref
({});
...
...
@@ -54,9 +55,6 @@
}
});
};
const
backCase
=
async
()
=>
{
showModal
.
value
=
true
};
const
submitForm
=
async
(
type
)
=>
{
const
ids
=
selectdList
.
value
.
map
((
v
)
=>
v
.
id
).
join
(
','
);
let
param
=
{
...
...
@@ -106,6 +104,32 @@
// getStatisis(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
=
[
{
label
:
'未分派'
,
value
:
'undistributed'
},
{
label
:
'分派到调解中心'
,
value
:
'tenant'
},
...
...
@@ -140,11 +164,9 @@
slots
:
{
default
:
({
row
})
=>
{
return
(
<
div
>
{
row
.
manageOrg
.
province
}
{
row
.
manageOrg
.
city
?
'-'
+
row
.
manageOrg
.
city
:
''
}
{
row
.
manageOrg
.
district
?
'-'
+
row
.
manageOrg
.
district
:
''
}
<
/div
>
<
VxeTooltip
content
=
{
row
.
borrower
.
domicileProvince
+
(
row
.
borrower
.
domicileCity
?
'-'
+
row
.
borrower
.
domicileCity
:
''
)
+
(
row
.
borrower
.
area
?
'-'
+
row
.
borrower
.
area
:
''
)}
>
<
VxeTextEllipsis
content
=
{
row
.
borrower
.
domicileProvince
+
(
row
.
borrower
.
domicileCity
?
'-'
+
row
.
borrower
.
domicileCity
:
''
)
+
(
row
.
borrower
.
area
?
'-'
+
row
.
borrower
.
area
:
''
)}
><
/VxeTextEllipsis
>
<
/VxeTooltip
>
);
},
},
...
...
@@ -286,6 +308,24 @@
showOverflow
:
'tooltip'
,
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
,
onCheckboxAll
:
onCheckboxAll
...
...
src/views/property/import/index.vue
View file @
dd518a58
<
template
>
<div
class=
"table-box"
>
<div
class=
"card flex mb-2"
>
<div
class=
"flex-1 pr-3"
>
<div
class=
"mb-1"
>
1、上传文件
</div>
<div>
<el-upload
class=
"avatar-uploader"
ref=
"uploadRef"
:action=
"upload.url"
:disabled=
"upload.isUploading"
accept=
".xls, .xlsx"
:limit=
"1"
:on-success=
"handleFileSuccess"
:on-remove=
"handleRemove"
:auto-upload=
"true"
:on-progress=
"uploadVideoProcess"
>
<el-button
type=
"primary"
plain
:icon=
"Upload"
>
上传文件
</el-button>
</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
class=
"card flex mb-2"
style=
"padding-top: 0"
>
<div
class=
"flex-1"
>
<div
class=
"mb-1 text-center step"
>
<div
class=
"xuhao"
>
1
</div>
上传文件
<div
class=
"jt"
><el-icon
size=
"60"
color=
"#e3e3e3d9"
><ArrowRight
/></el-icon></div>
</div>
<div
class=
"w-full flex items-center justify-center pt-5"
>
<div>
<el-upload
class=
"avatar-uploader"
ref=
"uploadRef"
:action=
"upload.url"
:disabled=
"upload.isUploading"
accept=
".xls, .xlsx"
:limit=
"1"
:on-success=
"handleFileSuccess"
:on-remove=
"handleRemove"
:auto-upload=
"true"
:on-progress=
"uploadVideoProcess"
>
<el-button
type=
"primary"
plain
:icon=
"Upload"
>
上传文件
</el-button>
</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
class=
"flex-1"
>
<div
class=
"mb-1"
>
2、检查数据
</div>
<div>
<div
class=
"flex items-center"
>
<el-button
type=
"danger"
@
click=
"checkData"
:disabled=
"!form.path"
>
检查
</el-button>
<span
class=
"ml-2"
>
<div
class=
"mb-1 text-center step"
>
<div
class=
"xuhao"
>
2
</div>
检查数据
<div
class=
"jt"
><el-icon
size=
"60"
color=
"#e3e3e3d9"
><ArrowRight
/></el-icon></div>
</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=
"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>
<!-- 进度条 -->
<!--
<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
class=
"flex-1 importwrapper"
>
<div
class=
"mb-1 text-center"
>
3、上传数据
</div>
<div
class=
"pr-4"
>
<el-form
ref=
"formRef"
inline
:model=
"form"
:rules=
"rules"
label-width=
"85px"
>
<el-form-item
class=
"w-full"
label=
"导入编号:"
prop=
"code"
>
<el-input
v-model=
"form.code"
placeholder=
"请输入"
style=
"width: 100%"
/>
</el-form-item>
<!--
<el-form-item
class=
"w-full"
label=
"委案合同:"
prop=
"contractNo"
>
<el-input
v-model=
"form.contractNo"
placeholder=
"请输入"
style=
"width: 100%"
/>
</el-form-item>
-->
<el-form-item
class=
"w-full"
label=
"折扣:"
prop=
"discount"
>
<el-input
v-model=
"form.discount"
placeholder=
"请输入"
style=
"width: 100%"
/>
</el-form-item>
</el-form>
<el-button
type=
"primary"
@
click=
"submitData"
:disabled=
"!form.path || !checkObj.checksuccess"
>
上传
</el-button
>
<div
class=
"mb-1 text-center step"
>
<div
class=
"xuhao"
>
3
</div>
上传数据
</div>
<div
class=
"w-full flex items-center justify-center pt-5"
>
<div
class=
"px-7"
>
<el-form
ref=
"formRef"
inline
:model=
"form"
:rules=
"rules"
label-width=
"85px"
>
<el-form-item
class=
"w-full"
label=
"导入编号:"
prop=
"code"
>
<el-input
v-model=
"form.code"
placeholder=
"请输入"
style=
"width: 100%"
/>
</el-form-item>
<!--
<el-form-item
class=
"w-full"
label=
"委案合同:"
prop=
"contractNo"
>
<el-input
v-model=
"form.contractNo"
placeholder=
"请输入"
style=
"width: 100%"
/>
</el-form-item>
-->
<el-form-item
class=
"w-full"
label=
"折扣:"
prop=
"discount"
>
<el-input
v-model=
"form.discount"
placeholder=
"请输入"
style=
"width: 100%"
/>
</el-form-item>
</el-form>
<div
class=
"flex justify-end"
>
<el-button
type=
"primary"
@
click=
"submitData"
:disabled=
"!form.path || !checkObj.checksuccess"
>
上传
</el-button
>
</div>
</div>
</div>
</div>
</div>
...
...
@@ -96,7 +116,7 @@
import
{
reactive
,
ref
}
from
'vue'
;
import
{
computed
,
onMounted
}
from
'vue'
;
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
{
LoanSubmit
,
importLoanPage
,
checkLoanExcel
}
from
'@/api/import'
;
...
...
@@ -317,4 +337,29 @@
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
>
src/views/property/import/step.svg
0 → 100644
View file @
dd518a58
<?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
src/views/property/repair-manage/index.vue
View file @
dd518a58
<
template
>
<div
class=
"card content-box"
>
<span
class=
"text"
>
修复管理 🍓🍇🍈🍉
</span>
<div
class=
"table-box"
>
<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>
</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
>
src/views/system/accountManage/components/AccountFormModal.vue
View file @
dd518a58
...
...
@@ -24,6 +24,23 @@
<el-input
v-model=
"form.nickName"
placeholder=
"请输入昵称"
/>
</el-form-item>
</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-form-item
class=
"w-full"
label=
"手机号"
prop=
"phone"
>
<el-input
v-model=
"form.phone"
placeholder=
"请输入手机号"
/>
...
...
@@ -51,6 +68,7 @@
import
{
computed
}
from
'vue'
;
import
{
ref
}
from
'vue'
;
import
{
saveUser
}
from
'@/api/user'
;
import
{
getDefualtRoles
}
from
'@/api/role'
;
import
{
ElMessage
}
from
'element-plus'
;
const
emits
=
defineEmits
([
'success'
]);
...
...
@@ -59,14 +77,30 @@
const
loading
=
ref
(
false
);
const
form
=
ref
({
username
:
''
,
roles
:
[],
nickName
:
''
,
password
:
''
,
phone
:
''
,
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
({
username
:
{
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
);
...
...
@@ -94,6 +128,7 @@
const
onHide
=
()
=>
{
form
.
value
=
{
username
:
''
,
roles
:
[],
nickName
:
''
,
password
:
''
,
phone
:
''
,
...
...
@@ -105,6 +140,9 @@
};
const
openModal
=
(
account
)
=>
{
account
&&
(
form
.
value
=
account
);
getDefualtRoles
().
then
(
res
=>
{
options
.
value
=
res
.
result
})
currentAccount
.
value
=
account
;
showModal
.
value
=
true
;
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment