还款凭证和还款计划

This commit is contained in:
liuxi 2024-12-20 18:03:44 +08:00
parent 7152372dca
commit 514d5ed605
23 changed files with 1885 additions and 376 deletions

View File

@ -173,6 +173,19 @@ html{
.padding-0{
padding: 0 !important;
}
.pt-6{
padding-top: 6px;
}
.pb-6{
padding-bottom: 6px;
}
.pr-6{
padding-right: 6px;
}
.pl-6{
padding-left: 6px;
}
.pt-8{
padding-top: $size8;
}
@ -474,6 +487,10 @@ html{
height: $height138;
}
.line-height-20{
line-height: 20px;
}
.line-height-30{
line-height: $height30;
}

View File

@ -0,0 +1,69 @@
<template>
<div>
<el-dialog title="预览"
:visible="true"
width="1050px"
append-to-body
@close="handleClose" >
<div slot="title">
<TitleBar title="预览"></TitleBar>
</div>
<div style="min-height:600px; " class="c-flex-center">
<!-- svg -->
<svgViewer :src="previewUrl" v-if="isSvg"></svgViewer>
<!-- 其他图片 -->
<el-image :src="previewUrl" fit="scale-down" v-else></el-image>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">关闭</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
components: {
svgViewer: () => import('./svg-viewer'),
},
props: {
previewUrl: {
type: String,
default: () => {
return ''
},
},
isSvg:{
type: Boolean,
default: false
}
},
data() {
return {
};
},
computed:{
},
async created() {
},
mounted(){
},
beforeDestroy() {
},
methods: {
handleClose() {
this.$emit('update:visible', false)
},
}
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,64 @@
<template>
<div>
<el-dialog
title="查看pdf文件"
:visible="true"
width="1100px"
append-to-body
:close-on-click-modal="false"
@close="handleClose" >
<div class="addContract p-16">
<el-scrollbar class="bor" :style="'height:'+`${contentHeight}`+'px'">
<iframe :src="previewUrl" width="100%" :height="`${contentHeight-5}`+'px'"></iframe>
</el-scrollbar>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">关闭</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
previewUrl: {
type: String,
default: () => {
return ''
},
},
},
data() {
return {
};
},
computed:{
// drawer
contentHeight(){
let oh = document.documentElement.clientHeight;
return oh-180
},
},
async created() {
},
mounted(){
},
beforeDestroy() {
},
methods: {
handleClose() {
// this.$emit('update:editSealFlag', false)
this.$emit('update:visible', false)
},
}
};
</script>

View File

@ -0,0 +1,44 @@
<template>
<div v-html="svgContent" :id="id"></div>
</template>
<script>
export default {
name: "svg-viewer",
props: {
id: {
type: String,
default: 'id',
},
src: {
type: String,
default() {
return ''
}
}
},
watch: {
src: {
immediate: true,
handler(val) {
if (!val) {
this.svgContent = ''
return;
}
fetch(val)
.then(res => res.text())
.then(ctx => this.svgContent = ctx)
}
}
},
data() {
return {
svgContent: ''
}
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,330 @@
<template>
<div class="upload-file-wrap">
<el-row :gutter="24">
<el-col :span="span" v-if="isInCount">
<div class="el-col-ctn-box">
<div class="el-col-upload-box">
<el-upload
class="el-upload-box"
ref="upload"
action=""
:accept="accept"
:show-file-list="false"
:http-request="httpRequest"
>
<div class="upload-file">
<i class="el-icon-plus uploader-file-icon"></i>
<div class="f14 color-text-secondary text-center">上传</div>
</div>
</el-upload>
<div class="f12 text-center color-text-regular line-height-20">{{uploadName}}</div>
</div>
</div>
</el-col>
<!--上传的图片预览-->
<el-col :span="span" v-for="(item,i) in lists" :key="i" >
<div class="el-col-ctn-box "
@click="handlePreview(item)">
<div class="el-col-upload-box">
<div class="upload-preview-box">
<img v-if="item.deletable && !readOnly"
class="upload-delete-icon" src="../assets/image/icon_close.png" alt=""
@click.stop.prevent="handleDelete(item, i)">
<div class="upload-file">
<el-image class="el-image-upload" :src="item.iconFrontSrc" fit="scale-down"></el-image>
</div>
</div>
<div class="f12 text-center color-text-regular line-height-20">
{{showFileName ? item.fileName : uploadName}}
</div>
</div>
</div>
</el-col>
</el-row>
<!-- 大图预览 -->
<dialogPreview v-if="editImgFlag" :visible.sync="editImgFlag" :previewUrl="previewPath" :isSvg="isSvg" />
<pdfPreview v-if="editPdfFlag" :visible.sync="editPdfFlag" :previewUrl="previewPath"/>
<videoPreview v-if="editMp4Flag" :visible.sync="editMp4Flag" :previewUrl="previewPath"/>
</div>
</template>
<script>
import projectConfig from "../services/projectConfig";
export default {
name: "uploadFile",
components: {
svgViewer: () => import('./svg-viewer'),
dialogPreview: () => import('./dialogPreview'),
pdfPreview: () => import('./pdfPreview.vue'),//PDF
videoPreview: () => import('./videoPreview.vue'),//
},
props: {
span: {
// layout
type: Number,
default: 5
},
accept: {
type: String,
default: '*',
},
imageHeight: {
//
type: String,
default: ''
},
imageMode: {
// ,uni image
type: String,
default: 'aspectFit'
},
readOnly: {
// true-false-
type: Boolean,
default: false
},
fileList: {
//
type: [Array, Object],
default: () => {
return [
//{ url:, fileName: }
]
}
},
uploadName: {
//
type: String,
default: '上传'
},
maxCount: {
//
type: Number,
default: 1
},
selectCount: {
//
type: Number,
default: 1
},
customUpload: {
//
type: Boolean,
default: false
},
autoUpload: {
//
type: Boolean,
default: true
},
showFileName: {
//
type: Boolean,
default: false
},
splitFileTitle: {
//
type: Boolean,
default: true
},
},
data() {
return {
lists: [
//{url: , fileName: , deletable: , readStatus: , iconFrontSrc: }
],
srcList: [],
dialogVisible: false,
isSvg: true,
editPdfFlag:false,
editMp4Flag:false,
editImgFlag: false,
previewPath:'',
}
},
computed: {
isInCount() {
return (this.lists.length < this.maxCount) && !this.readOnly
},
},
watch: {
//
fileList: {
immediate: true,
handler() {
this.formatFileList()
}
},
},
methods: {
formatFileList() {
let fileList = this.fileList || []
this.srcList = []
fileList = JSON.parse(JSON.stringify(fileList))
// console.log('upload===========formatFileList()==========fileList', fileList)
const lists = fileList.map(item => {
let obj = Object.assign(item)
obj.deletable = typeof(obj.deletable) === 'boolean' ? obj.deletable : true
let text = obj.url || obj.fileName
obj.fileType = this.$util.getFileExtension(text)
// ()
obj.iconFrontSrc = this.$util.getIcon(obj)
// let previewUrl = `${projectConfig.fileHost}${obj.url}`
let previewUrl = `/manage-center/minio/preview/${obj.url}`
if(obj.url.includes('http')){
previewUrl = obj.url
}
obj.previewUrl = previewUrl
if(this.$util.getFileType(text) === 'image') {
//
obj.iconFrontSrc = obj.previewUrl
}
this.srcList.push(obj.iconFrontSrc)
return obj
});
this.lists = lists
// console.log('uploadFile----:', this.lists)
// this.isInCount = (lists.length < this.maxCount) && !this.readOnly
},
async httpRequest(param) {
// console.log('httpRequest',param)
let fileType = this.$util.getFileExtension(param.file.name)
if(this.accept !== '*' && this.accept.indexOf(fileType) === -1) {
this.$message.warning(`不能上传${fileType}格式的文件`)
return
}
try{
let formData = new FormData()
formData.append('file', param.file)
// let uploadFileRes = await fetchApi.uploadFile(formData);
let uploadFileRes = await this.$fetchApi.uploadFile(formData);
// console.log(uploadFileRes)
let fileList = JSON.parse(JSON.stringify(this.fileList))
fileList.push({
url: uploadFileRes.url,
fileSize: uploadFileRes.size
})
this.$emit('handleUploadFile', fileList)
}catch (e) {
this.$message.error(e.msg)
}
},
async handlePreview(item) {
// try {
// let res = await this.$fetchApi.getMinioToken({objectName: item.url})
// window.open(`${item.previewUrl}?token=${res}`, '_target')
// }catch (e) {
// this.$message.error(e.msg || e)
// }
if (!this.isImg) {return}
this.isSvg = false;
let analysisType = this.$util.getFileType(item.fileType);
console.log(analysisType,'analysisType')
if (item.fileType === 'svg'){
this.previewPath = item.iconFrontSrc
this.isSvg = true;
this.editImgFlag = true;
}else if (analysisType === 'image'){
if (item.previewUrl) {
this.previewPath = item.previewUrl
}else {
this.previewPath = await commonFun.viewFile2({url: item.url})
}
this.editImgFlag = true;
}else if(analysisType.toLowerCase() === 'mp4' || analysisType.toLowerCase() === 'video'){
if (item.previewUrl) {
this.previewPath = item.previewUrl
}else {
this.previewPath = await commonFun.viewFile2({url: item.url})
}
this.editMp4Flag = true;
}else if(analysisType.toLowerCase() === 'pdf'){
if (item.previewUrl) {
this.previewPath = item.previewUrl
}else {
this.previewPath = await commonFun.viewFile2({url: item.url})
}
this.editPdfFlag = true;
}else {
let res = await commonFun.viewFile2({url: item.url})
window.open(`${res}`, '_target')
}
},
handleDelete(item, i) {
this.lists.splice(i, 1)
let fileList = JSON.parse(JSON.stringify(this.fileList))
fileList.splice(i, 1)
this.$emit('handleUploadFile', fileList)
}
},
}
</script>
<style lang="scss">
.el-col-ctn-box{
width: 100%;
height: 160px;
}
.el-col-upload-box{
width: 120px;
height: 160px;
border-radius: 4px;
overflow: hidden;
}
.el-upload-box{
width: 100%;
height: 120px;
background: #F5F7FA;
border: 1px dashed #EBEEF5;
}
.el-col-ctn-box .el-upload,
.el-col-ctn-box .upload-file{
width: 100% !important;
}
.el-col-ctn-box .upload-preview-box{
position: relative;
height: 120px;
border: 1px dashed #EBEEF5;
}
.el-col-ctn-box .upload-delete-icon{
width: 30px;
height: auto;
position: absolute;
right: 0;
top: 0;
cursor: pointer;
z-index: 11111;
}
.el-col-ctn-box .upload-file{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
height: 120px;
}
.el-col-ctn-box .uploader-file-icon{
font-size: 32px;
color: $color-text-secondary;
}
.el-col-ctn-box .el-image-upload{
border-radius: 4px;
padding: 5px;
box-sizing: border-box;
}
.el-col-ctn-box .txt-center{
height: 40px;
line-height: 20px;
}
.line-height-30{
line-height: 30px;
}
</style>

View File

@ -1,253 +1,354 @@
<template>
<div class="upload-file-wrap">
<el-row :gutter="24">
<el-col :span="span" v-if="isInCount">
<div class="el-col-ctn-box">
<div class="el-col-upload-box">
<el-upload
class="el-upload-box"
ref="upload"
action=""
:accept="accept"
:show-file-list="false"
:http-request="httpRequest"
>
<div class="upload-file">
<i class="el-icon-plus uploader-file-icon"></i>
<div class="f14 color-text-secondary text-center">上传材料</div>
</div>
</el-upload>
<div class="f14 text-center color-text-regular line-height-30">{{uploadName}}</div>
</div>
<el-row>
<el-col :span="span" v-if="isInCount">
<div class="el-col-ctn-box">
<div class="el-col-upload-box">
<el-upload
class="el-upload-box"
ref="upload"
action=""
:accept="accept"
:show-file-list="false"
:http-request="httpRequest"
>
<div class="upload-file">
<i class="el-icon-plus uploader-file-icon"></i>
<!-- <div class="font-size-12 color-BCDFFD text-center">上传材料</div> -->
</div>
</el-col>
<!--上传的图片预览-->
<el-col :span="span" v-for="(item,i) in lists" :key="i" >
<div class="el-col-ctn-box "
@click="handlePreview(item)">
<div class="el-col-upload-box">
<div class="upload-preview-box">
<img v-if="item.deletable && !readOnly"
class="upload-delete-icon" src="../assets/image/icon_close.png" alt=""
@click.stop.prevent="handleDelete(item, i)">
<div class="upload-file">
<el-image class="el-image-upload" :src="item.iconFrontSrc" fit="scale-down"></el-image>
</div>
</div>
<div class="f14 text-center color-text-regular line-height-30">
{{showFileName ? item.fileName : uploadName}}
</div>
</div>
</el-upload>
<div class="font-size-12 color-a9a9a9 text-center line-height-20">{{ uploadName }}</div>
</div>
</div>
</el-col>
<!--上传的图片预览-->
<el-col :span="span" v-for="(item,i) in lists" :key="i">
<div class="el-col-ctn-box "
@click="handlePreview(item)">
<div class="el-col-upload-box">
<div class="upload-preview-box">
<img v-if="item.deletable && !readOnly"
class="upload-delete-icon" src="../assets/image/icon_close.png" alt=""
@click.stop.prevent="handleDelete(item, i)">
<div class="upload-file">
<!-- svg展示 -->
<svgViewer :src="item.iconFrontSrc" class="el-image-upload" v-if="item.fileType==='svg'"> </svgViewer>
<!-- 其他展示 -->
<el-image class="el-image-upload" :src="item.iconFrontSrc" fit="scale-down" v-else></el-image>
</div>
</el-col>
</el-row>
</div>
<div v-if="!showFileName" class="font-size-12 color-a9a9a9 text-center line-height-20">
{{ showFileName ? item.fileName : maxCount === 1 ? uploadName : '' }}
</div>
</div>
</div>
</el-col>
</el-row>
<!-- 大图预览 -->
<dialogPreview v-if="editImgFlag" :visible.sync="editImgFlag" :previewUrl="previewPath" :isSvg="isSvg" />
<pdfPreview v-if="editPdfFlag" :visible.sync="editPdfFlag" :previewUrl="previewPath"/>
<videoPreview v-if="editMp4Flag" :visible.sync="editMp4Flag" :previewUrl="previewPath"/>
</div>
</template>
</template>
<script>
import commonFun from "../services/projectConfig";
export default {
name: "uploadFile",
components: {
svgViewer: () => import('./svg-viewer'),
dialogPreview: () => import('./dialogPreview'),
pdfPreview: () => import('./pdfPreview.vue'),//PDF
videoPreview: () => import('./videoPreview.vue'),//
},
props: {
span: {
// layout
type: Number,
default: 5
},
accept: {
type: String,
default: '*',
},
imageHeight: {
//
type: String,
default: ''
},
imageMode: {
// ,uni image
type: String,
default: 'aspectFit'
},
readOnly: {
// true-false-
type: Boolean,
default: false
},
fileList: {
//
type: [Array, Object],
default: () => {
return [
//{ url:, fileName: }
]
}
},
uploadName: {
//
type: String,
default: '上传'
},
maxCount: {
//
type: Number,
default: 1
},
selectCount: {
//
type: Number,
default: 1
},
customUpload: {
//
type: Boolean,
default: false
},
autoUpload: {
//
type: Boolean,
default: true
},
showFileName: {
//
type: Boolean,
default: false
},
splitFileTitle: {
//
type: Boolean,
default: true
},
isImg: {
//
type: Boolean,
default: true
},
fileSize: {
// -M
type: Number,
default: 10
},
serveType: {
// 1线 2线
type: Number,
default: 1
}
},
data() {
return {
lists: [
//{url: , fileName: , deletable: , readStatus: , iconFrontSrc: }
],
dialogVisible: false,
isSvg: true,
editPdfFlag:false,
editMp4Flag:false,
editImgFlag: false,
previewPath:'',
}
},
computed: {
isInCount() {
return (this.lists.length < this.maxCount) && !this.readOnly
},
},
watch: {
//
fileList: {
immediate: true,
handler() {
this.formatFileList()
}
},
},
methods: {
formatFileList() {
let fileList = this.fileList || []
fileList = JSON.parse(JSON.stringify(fileList))
// console.log('upload===========formatFileList()==========fileList', fileList)
const lists = fileList.map(item => {
let obj = Object.assign(item)
obj.deletable = typeof (obj.deletable) === 'boolean' ? obj.deletable : true
let text = obj.url || obj.fileName
obj.fileType = this.$util.getFileExtension(text)
obj.iconFrontSrc = this.$util.getIcon(obj)
<script>
import projectConfig from "../services/projectConfig";
export default {
name: "uploadFile",
props: {
span: {
// layout
type: Number,
default: 5
},
accept: {
type: String,
default: '*',
},
imageHeight: {
//
type: String,
default: ''
},
imageMode: {
// ,uni image
type: String,
default: 'aspectFit'
},
readOnly: {
// true-false-
type: Boolean,
default: false
},
fileList: {
//
type: [Array, Object],
default: () => {
return [
//{ url:, fileName: }
]
}
},
uploadName: {
//
type: String,
default: '上传'
},
maxCount: {
//
type: Number,
default: 1
},
selectCount: {
//
type: Number,
default: 1
},
customUpload: {
//
type: Boolean,
default: false
},
autoUpload: {
//
type: Boolean,
default: true
},
showFileName: {
//
type: Boolean,
default: false
},
splitFileTitle: {
//
type: Boolean,
default: true
},
},
data() {
return {
lists: [
//{url: , fileName: , deletable: , readStatus: , iconFrontSrc: }
],
srcList: [],
// let previewUrl = `${projectConfig.fileHost}${obj.url}`
let previewUrl = `/manage-center/minio/preview/${obj.url}`
if(obj.url.includes('http')){
previewUrl = obj.url
}
},
computed: {
isInCount() {
return (this.lists.length < this.maxCount) && !this.readOnly
},
},
watch: {
//
fileList: {
immediate: true,
handler() {
this.formatFileList()
}
},
},
methods: {
formatFileList() {
let fileList = this.fileList || []
this.srcList = []
fileList = JSON.parse(JSON.stringify(fileList))
// console.log('upload===========formatFileList()==========fileList', fileList)
const lists = fileList.map(item => {
let obj = Object.assign(item)
obj.deletable = typeof(obj.deletable) === 'boolean' ? obj.deletable : true
let text = obj.url || obj.fileName
obj.fileType = this.$util.getFileExtension(text)
// ()
obj.iconFrontSrc = this.$util.getIcon(obj)
// let previewUrl = `${projectConfig.fileHost}${obj.url}`
let previewUrl = `/manage-center/minio/preview/${obj.url}`
if(obj.url.includes('http')){
previewUrl = obj.url
}
obj.previewUrl = previewUrl
if(this.$util.getFileType(text) === 'image') {
//
obj.iconFrontSrc = obj.previewUrl
}
this.srcList.push(obj.iconFrontSrc)
return obj
});
this.lists = lists
// console.log('uploadFile----:', this.lists)
// this.isInCount = (lists.length < this.maxCount) && !this.readOnly
},
async httpRequest(param) {
// console.log('httpRequest',param)
let fileType = this.$util.getFileExtension(param.file.name)
if(this.accept !== '*' && this.accept.indexOf(fileType) === -1) {
this.$message.warning(`不能上传${fileType}格式的文件`)
return
}
try{
let formData = new FormData()
formData.append('file', param.file)
// let uploadFileRes = await fetchApi.uploadFile(formData);
let uploadFileRes = await this.$fetchApi.uploadFile(formData);
// console.log(uploadFileRes)
let fileList = JSON.parse(JSON.stringify(this.fileList))
fileList.push({
url: uploadFileRes.url,
fileSize: uploadFileRes.size
})
this.$emit('handleUploadFile', fileList)
}catch (e) {
this.$message.error(e.msg)
}
},
async handlePreview(item) {
// console.log(item,111111)
try {
let res = await this.$fetchApi.getMinioToken({objectName: item.url})
// console.log(res)
window.open(`${item.previewUrl}?token=${res}`, '_target')
}catch (e) {
this.$message.error(e.msg || e)
}
},
handleDelete(item, i) {
this.lists.splice(i, 1)
let fileList = JSON.parse(JSON.stringify(this.fileList))
fileList.splice(i, 1)
this.$emit('handleUploadFile', fileList)
obj.previewUrl = previewUrl
if(this.$util.getFileType(text) === 'image') {
//
obj.iconFrontSrc = obj.previewUrl
}
},
}
</script>
<style lang="scss">
.el-col-ctn-box{
return obj
});
this.lists = lists
// console.log('uploadFile----:', this.lists)
},
async httpRequest(param) {
console.log(this.accept,'httpRequest上传文件', param)
let fileType = this.$util.getFileExtension(param.file.name)
// :png,jpg,bmp
if (this.accept !== '*' && this.accept.indexOf(fileType) === -1) {
this.$message({message: `不能上传${fileType}格式的文件`, type: 'warning'});
return
}
// 100M
const uploadfileSize = param.file.size
if (uploadfileSize.toFixed(2) > (this.fileSize * 1024 * 1024)) {
this.$message({message: `请上传大小需在${this.fileSize}MB以内的文件`, type: 'warning'});
return
}
try {
// let formData = new FormData()
// formData.append('file', param.file)
// if (this.serveType === 1){
// let uploadFileRes = await commonFun.uploadFile(formData);
// let fileList = JSON.parse(JSON.stringify(this.fileList))
// fileList.push({
// url: uploadFileRes.minioUrl,
// previewUrl: uploadFileRes.preSignDownload,
// fileType: this.$util.getFileExtension(uploadFileRes.minioUrl)
// })
// this.$emit('handleUploadFile', fileList)
// }else {
// let uploadFileRes = await commonFun.uploadFile2(formData);
// let fileList = JSON.parse(JSON.stringify(this.fileList))
// fileList.push({
// url: uploadFileRes.url,
// previewUrl: uploadFileRes.fullUrl,
// fileType: this.$util.getFileExtension(uploadFileRes.url),
// fileName: uploadFileRes.objectName
// })
// this.$emit('handleUploadFile', fileList)
// }
let formData = new FormData()
formData.append('file', param.file)
let uploadFileRes = await this.$fetchApi.uploadFile(formData);
let fileList = JSON.parse(JSON.stringify(this.fileList))
fileList.push({
url: uploadFileRes.url,
fileSize: uploadFileRes.size,
fileType: this.$util.getFileExtension(uploadFileRes.url),
fileName: uploadFileRes.objectName
})
this.$emit('handleUploadFile', fileList)
} catch (e) {
this.$message.error(e.msg)
}
},
async handlePreview(item) {
// try {
// let res = await this.$fetchApi.getMinioToken({objectName: item.url})
// window.open(`${item.previewUrl}?token=${res}`, '_target')
// }catch (e) {
// this.$message.error(e.msg || e)
// }
if (!this.isImg) {return}
this.isSvg = false;
let analysisType = this.$util.getFileType(item.fileType);
if (item.fileType === 'svg'){
this.previewPath = item.iconFrontSrc
this.isSvg = true;
this.editImgFlag = true;
}else if (analysisType === 'image'){
if (item.previewUrl) {
this.previewPath = item.previewUrl
}else {
this.previewPath = await commonFun.viewFile2({url: item.url})
}
this.editImgFlag = true;
}else if(analysisType.toLowerCase() === 'mp4' || analysisType.toLowerCase() === 'video'){
if (item.previewUrl) {
this.previewPath = item.previewUrl
}else {
this.previewPath = await commonFun.viewFile2({url: item.url})
}
this.editMp4Flag = true;
}else if(analysisType.toLowerCase() === 'pdf'){
if (item.previewUrl) {
this.previewPath = item.previewUrl
}else {
this.previewPath = await commonFun.viewFile2({url: item.url})
}
this.editPdfFlag = true;
}else {
let res = await commonFun.viewFile2({url: item.url})
window.open(`${res}`, '_target')
}
},
handleDelete(item, i) {
this.lists.splice(i, 1)
let fileList = JSON.parse(JSON.stringify(this.fileList))
fileList.splice(i, 1)
this.$emit('handleUploadFile', fileList)
}
},
}
</script>
<style lang="scss">
.el-col-ctn-box {
width: 100%;
height: 160px;
}
.el-col-upload-box{
// height: 154px;
}
.el-col-upload-box {
width: 120px;
height: 160px;
// height: 154px;
border-radius: 4px;
overflow: hidden;
}
.el-upload-box{
// overflow: hidden;
}
.el-upload-box {
width: 100%;
height: 120px;
background: #F5F7FA;
border: 1px dashed #EBEEF5;
}
.el-col-ctn-box .el-upload,
.el-col-ctn-box .upload-file{
background: #eeeeee;
border: 1px dashed #dcdcdc;
border-radius: 4px;
}
.el-col-ctn-box .el-upload,
.el-col-ctn-box .upload-file {
width: 100% !important;
}
.el-col-ctn-box .upload-preview-box{
}
.el-col-ctn-box .upload-preview-box {
position: relative;
height: 120px;
border: 1px dashed #EBEEF5;
}
.el-col-ctn-box .upload-delete-icon{
border: 1px solid rgba(151, 168, 177, 0.2);
border-radius: 4px;
}
.el-col-ctn-box .upload-delete-icon {
width: 30px;
height: auto;
position: absolute;
@ -255,29 +356,39 @@
top: 0;
cursor: pointer;
z-index: 11111;
}
.el-col-ctn-box .upload-file{
}
.el-col-ctn-box .upload-file {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
height: 120px;
}
.el-col-ctn-box .uploader-file-icon{
}
.el-col-ctn-box .uploader-file-icon {
font-size: 32px;
color: $color-text-secondary;
}
.el-col-ctn-box .el-image-upload{
color: #000;
}
.el-col-ctn-box .el-image-upload {
border-radius: 4px;
padding: 5px;
box-sizing: border-box;
}
.el-col-ctn-box .txt-center{
svg {
width: 120px;
height: 120px;
}
}
.el-col-ctn-box .txt-center {
height: 40px;
line-height: 20px;
}
.line-height-30{
}
.line-height-30 {
line-height: 30px;
}
</style>
}
</style>

View File

@ -0,0 +1,62 @@
<template>
<div>
<el-dialog
title="查看视频文件"
:visible="true"
width="1100px"
append-to-body
:close-on-click-modal="false"
@close="handleClose">
<div class="addContract">
<video id="video" width="100%" :height="contentHeight" :src="previewUrl" preload="auto" autoplay="autoplay"
controls="" controlsList="nodownload noremote footbar"></video>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">关闭</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
previewUrl: {
type: String,
default: () => {
return ''
},
},
},
data() {
return {};
},
computed: {
// drawer
contentHeight() {
let oh = document.documentElement.clientHeight;
return oh - 330
},
},
async created() {
},
mounted() {
},
beforeDestroy() {
},
methods: {
handleClose() {
// this.$emit('update:editSealFlag', false)
this.$emit('update:visible', false)
},
}
};
</script>

View File

@ -49,7 +49,7 @@
</div>
<div class="case-table">
<el-table :data="tableData" :height="`${contentHeight}`" >
<el-table :data="tableData" height="330" >
<el-table-column type="index" label="序号" width="55"></el-table-column>
<!-- <el-table-column type="selection" width="55" ></el-table-column> -->
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>

View File

@ -62,7 +62,7 @@
<el-table-column type="index" label="序号" width="55"></el-table-column>
<!-- <el-table-column type="selection" width="55" ></el-table-column> -->
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="200" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="发起方式" show-overflow-tooltip ></el-table-column>
<el-table-column prop="documentType" label="文书送达范围" show-overflow-tooltip ></el-table-column>
<el-table-column prop="status" label="送达状态" show-overflow-tooltip ></el-table-column>

View File

@ -62,7 +62,7 @@
<el-table-column type="index" label="序号" width="55"></el-table-column>
<!-- <el-table-column type="selection" width="55" ></el-table-column> -->
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="200" show-overflow-tooltip ></el-table-column>
<el-table-column prop="documentType" label="文书类型" show-overflow-tooltip ></el-table-column>
<el-table-column prop="documentNum" label="生成文书数" show-overflow-tooltip ></el-table-column>
<el-table-column prop="status" label="生成状态" show-overflow-tooltip ></el-table-column>

View File

@ -62,7 +62,7 @@
<el-table-column type="index" label="序号" width="55"></el-table-column>
<!-- <el-table-column type="selection" width="55" ></el-table-column> -->
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="280" show-overflow-tooltip ></el-table-column>
<el-table-column prop="documentType" label="文书类型" show-overflow-tooltip ></el-table-column>
<el-table-column prop="status" label="签章状态" show-overflow-tooltip ></el-table-column>
<el-table-column prop="failureReason" label="失败原因" show-overflow-tooltip ></el-table-column>

View File

@ -62,7 +62,7 @@
<el-table-column type="index" label="序号" width="55"></el-table-column>
<!-- <el-table-column type="selection" width="55" ></el-table-column> -->
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="200" show-overflow-tooltip ></el-table-column>
<el-table-column prop="documentType" label="文书类型" show-overflow-tooltip ></el-table-column>
<el-table-column prop="signatureFileCount" label="签字文书数" show-overflow-tooltip ></el-table-column>
<el-table-column prop="planStartTime" label="签字截止时间" show-overflow-tooltip >

View File

@ -58,17 +58,17 @@
</div>
<div class="case-table">
<el-table :data="tableData" :height="`${contentHeight}`" >
<el-table :data="tableData" height="330" >
<el-table-column type="index" label="序号" width="55"></el-table-column>
<!-- <el-table-column type="selection" width="55" ></el-table-column> -->
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="entrustingAgencyName" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="被申请人" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="还款方案" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="还款截止日期" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="应还金额" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="实际还款日期" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="实际还款金额" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="200" show-overflow-tooltip ></el-table-column>
<el-table-column prop="respondent" label="被申请人" show-overflow-tooltip ></el-table-column>
<el-table-column prop="planType" label="还款方案" show-overflow-tooltip ></el-table-column>
<el-table-column prop="deadline" label="还款截止日期" show-overflow-tooltip ></el-table-column>
<el-table-column prop="payableAmount" label="应还金额" show-overflow-tooltip ></el-table-column>
<el-table-column prop="actualPayDate" label="实际还款日期" show-overflow-tooltip ></el-table-column>
<el-table-column prop="amount" label="实际还款金额" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="状态" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="操作人" show-overflow-tooltip ></el-table-column>
<el-table-column prop="planStartTime" label="操作时间" show-overflow-tooltip >
@ -77,7 +77,7 @@
</template>
</el-table-column>
<el-table-column label="操作" width="120">
<el-table-column label="操作" width="150">
<template slot-scope="scope">
<div class="flex-row align-items-center">
<el-button size="mini" @click="handleBackCase(scope)">效验</el-button>
@ -90,8 +90,8 @@
<div class="text-center pt-16">
<el-pagination
@size-change="getCaseInfoList"
@current-change="getCaseInfoList"
@size-change="getList"
@current-change="getList"
:current-page="queryParam.current"
:page-size="queryParam.size"
layout="total, prev, pager, next, jumper"
@ -122,7 +122,10 @@ import api from "@/services/eventTracingApi";
DialogDetail:null,
queryDate: '',
queryParam:{
caseNo:''
caseNo:'',
pkgName:'',
size:10,
current:1
},
tableData:[],
total:0,
@ -130,6 +133,7 @@ import api from "@/services/eventTracingApi";
},
mounted () {
this.queryParam.caseNo = this.eventTraDialog.caseNo
this.getList(1)
},
methods: {
handleChangeDate() {
@ -152,23 +156,20 @@ import api from "@/services/eventTracingApi";
handleSearch() {
this.queryParam.size = 10;
this.queryParam.current = 1;
// this.getList(1)
this.getList(1)
},
//
getList(val){
this.queryParam.planBegin = this.queryParam.beginTime
this.queryParam.planEnd = this.queryParam.endTime
this.queryParam.current = val
// api.getCasePkgQuery(this.queryParam).then(res => {
// if (!res.code) {
// this.tableData = res.records;
// this.total = res.total;
// }
// })
api.posttrace_proof(this.queryParam).then(res => {
if (!res.code) {
this.tableData = res.records;
this.total = res.total;
}
})
},
handleDetail(scope){
this.DialogDetail = scope.row
}
}
};
</script>

View File

@ -62,7 +62,7 @@
<el-table-column type="index" label="序号" width="55"></el-table-column>
<!-- <el-table-column type="selection" width="55" ></el-table-column> -->
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="200" show-overflow-tooltip ></el-table-column>
<el-table-column prop="templateId" label="短信模板" show-overflow-tooltip ></el-table-column>
<el-table-column prop="sendObjectType" label="短信接收对象" show-overflow-tooltip ></el-table-column>
<el-table-column prop="countInit" label="记录数量" show-overflow-tooltip ></el-table-column>

View File

@ -61,7 +61,7 @@
<el-table :data="tableData" height="330" >
<el-table-column type="index" label="序号" width="55"></el-table-column>
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="200" show-overflow-tooltip ></el-table-column>
<el-table-column prop="bookingTime" label="预约开始时间" show-overflow-tooltip ></el-table-column>
<el-table-column prop="bookingEndTime" label="预约结束时间" show-overflow-tooltip ></el-table-column>
<el-table-column prop="status" label="状态" show-overflow-tooltip ></el-table-column>
@ -132,7 +132,7 @@ import api from "@/services/eventTracingApi";
},
mounted () {
this.queryParam.caseNo = this.eventTraDialog.caseNo
this.getList
this.getList()
},
methods: {
handleChangeDate() {

View File

@ -48,10 +48,10 @@
</div>
<div class="case-table">
<el-table :data="tableData" :height="`${contentHeight}`" >
<el-table :data="tableData" height="330" >
<el-table-column type="index" label="序号" width="55"></el-table-column>
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="200" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="文书接收人" show-overflow-tooltip ></el-table-column>
<el-table-column prop="documentType" label="文书类型" show-overflow-tooltip ></el-table-column>
<el-table-column prop="status" label="送达状态" show-overflow-tooltip ></el-table-column>
@ -61,14 +61,14 @@
</template>
</el-table-column>
<el-table-column prop="failureReason" label="未送达原因" show-overflow-tooltip ></el-table-column>
<el-table-column label="操作" width="120">
<!-- <el-table-column label="操作" width="140">
<template slot-scope="scope">
<div class="flex-row align-items-center">
<el-button size="mini" @click="handleDelete(scope)">重试</el-button>
<el-button size="mini" @click="handleBackCase(scope)">取消</el-button>
</div>
</template>
</el-table-column>
</el-table-column> -->
</el-table>
</div>

View File

@ -60,7 +60,7 @@
<el-table :data="tableData" height="340" >
<el-table-column type="index" label="序号" width="55"></el-table-column>
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" show-overflow-tooltip ></el-table-column>
<el-table-column prop="caseNo" label="案件编号" width="200" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="短信模板" show-overflow-tooltip ></el-table-column>
<el-table-column prop="receiver" label="短信接收人" show-overflow-tooltip ></el-table-column>
<el-table-column prop="phone" label="电话号码" show-overflow-tooltip ></el-table-column>

View File

@ -33,27 +33,27 @@
<img src="../../../assets/image/mediate/m-info-robot.png" />
</span>
<span class="separation"></span>
<span class="left-img-info flex-column" :class="leftActive == 1 ?'active':''" @click="leftActive = 1">
<span class="left-img-info flex-column" :class="leftActive == 1 ?'active':''" @mouseenter="leftActive = 1">
<img src="../../../assets/image/mediate/m-info1.png" />
<a>案件信息</a>
</span>
<span class="left-img-info flex-column" :class="leftActive == 2 ?'active':''" @click="leftActive = 2">
<span class="left-img-info flex-column" :class="leftActive == 2 ?'active':''" @mouseenter="leftActive = 2">
<img src="../../../assets/image/mediate/m-info2.png" />
<a>联系人</a>
</span>
<span class="left-img-info flex-column" :class="leftActive == 3 ?'active':''" @click="leftActive = 3">
<span class="left-img-info flex-column" :class="leftActive == 3 ?'active':''" @mouseenter="leftActive = 3">
<img src="../../../assets/image/mediate/m-info3.png" />
<a>案件材料</a>
</span>
<span class="left-img-info flex-column" :class="leftActive == 4 ?'active':''" @click="leftActive = 4">
<span class="left-img-info flex-column" :class="leftActive == 4 ?'active':''" @mouseenter="leftActive = 4">
<img src="../../../assets/image/mediate/m-info4.png" />
<a>还款方</a>
<a>件文书</a>
</span>
<span class="left-img-info flex-column" :class="leftActive == 5 ?'active':''" @click="leftActive = 5">
<span class="left-img-info flex-column" :class="leftActive == 5 ?'active':''" @mouseenter="leftActive = 5">
<img src="../../../assets/image/mediate/m-info5.png" />
<a>还款计划</a>
</span>
<span class="left-img-info flex-column" :class="leftActive == 6 ?'active':''" @click="leftActive = 6">
<span class="left-img-info flex-column" :class="leftActive == 6 ?'active':''" @mouseenter="leftActive = 6">
<img src="../../../assets/image/mediate/m-info6.png" />
<a>还款凭证</a>
</span>
@ -61,7 +61,7 @@
<div class="layout-center-left2-wrap">
<el-scrollbar :style="'height:'+`${leftContentHeight}`+'px'">
<!-- 债务信息 -->
<div class="case-debt-info">
<div v-if="leftActive == 1" class="case-debt-info">
<!-- <div>债务信息</div> -->
<div class="case-detail-label f-weight500 f18 mb-8">基本信息</div>
<div class="case-detail-des flex-column">
@ -104,8 +104,103 @@
</div>
<!-- 联系人信息 -->
<div v-if="leftActive == 2" class="case-contact-person">
<div class="mb-16 flex-row justify-content-between">
<span class="f-weight500 f18">联系人信息</span>
<span class="cursor-pointer" @click="contactAddFlag = true"><i class="el-icon-plus"></i> 添加联系人</span>
</div>
<div v-if="contactAddFlag" class="case-detail-des flex-column mb-16">
<div class="flex-row justify-content-between">
<div class="flex-row mb-8">
<a class="f16" style="width: 130px;">
<el-input v-model.trim="contactAddObj.Name"
clearable placeholder="请输入姓名" size="small">
</el-input>
</a>
<a style="width: 140px;margin-left: 5px">
<el-select v-model="contactAddObj.relation"
placeholder="与债务人关系" size="small"
class="width100">
<el-option
v-for="(item,index) in relationOptions"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</a>
</div>
<div class="flex-row">
<a class="cursor-pointer pt-6">添加</a>
<a class="cursor-pointer ml-8 pt-6" @click="contactAddFlag = false;contactAddObj = {}">取消</a>
</div>
</div>
<div class="flex-row">
<a style="width: 180px;">
<el-input v-model.trim="contactAddObj.Phone" size="small"
clearable placeholder="请输入手机号码" maxlength="11">
</el-input>
</a>
</div>
</div>
<div class="case-detail-des flex-column mb-16">
<div class="flex-row justify-content-between">
<div v-if="!contactUpdate" class="flex-row mb-8">
<a class="f16">张三</a>
<div class="case-lable">
<a class="case-status0">本人</a>
<a class="case-status1">空号</a>
</div>
</div>
<div v-if="contactUpdate" class="flex-row mb-8">
<a class="f16" style="width: 130px;">
<el-input v-model.trim="contactObj.Name"
clearable placeholder="请输入姓名" size="small">
</el-input>
</a>
<a style="width: 140px;margin-left: 5px">
<el-select v-model="contactObj.relation"
placeholder="请选择与债务人关系" size="small"
class="width100">
<el-option
v-for="(item,index) in relationOptions"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</a>
</div>
<div class="flex-row">
<a v-if="contactUpdate" class="cursor-pointer pt-6">保存</a>
<a v-if="contactUpdate" @click="contactUpdate = false" class="cursor-pointer ml-8 pt-6">取消</a>
<a v-if="!contactUpdate" @click="contactUpdate = true" class="cursor-pointer">编辑</a>
<a v-if="!contactUpdate" class="cursor-pointer ml-8">删除</a>
</div>
</div>
<div v-if="!contactUpdate">
<a>手机号码:</a><a class="ml-8">13333333333</a>
</div>
<div v-if="contactUpdate" class="flex-row">
<a style="width: 180px;">
<el-input v-model.trim="contactObj.Phone" size="small"
clearable placeholder="请输入手机号码" maxlength="11">
</el-input>
</a>
</div>
</div>
</div>
<!-- 还款计划 -->
<div v-if="leftActive == 5" class="case-repayment-schedule">
<RepaymentSchedule :eventDialog.sync="eventDialog" />
</div>
<!-- 还款凭证 -->
<div v-if="leftActive == 6" class="case-repayment-certificate">
<RepaymentCertificate :eventDialog.sync="eventDialog" />
</div>
<!-- 债务信息 -->
</el-scrollbar>
</div>
@ -271,9 +366,12 @@ import api from "@/services/caseManagement";
export default {
components: {
uploadFile: () => import('@/components/uploadFile.vue'),//
RepaymentSchedule: () => import('./RepaymentSchedule.vue'),//
RepaymentCertificate: () => import('./RepaymentCertificate.vue'),//
},
data() {
return {
eventDialog:{caseId:this.$route.query.caseId},
leftActive:1,
rightActive:1,
fileList:[],
@ -281,6 +379,46 @@ import api from "@/services/caseManagement";
baseInfo:{},//
obligorInfo:[],//
caseId:'',//id
//
contactAddObj:{},
contactAddFlag:false,
contactObj:{},
contactUpdate:false,
relationOptions:[{label:'本人',value:'本人'},{label:'父母',value:'父母'},{label:'配偶',value:'配偶'},
{label:'子女',value:'子女'},{label:'其他',value:'其他'},{label:'朋友',value:'朋友'},{label:'兄弟',value:'兄弟'},
{label:'同事',value:'同事'},{label:'同学',value:'同学'}],
//
repaymentObj:{
type:'ALL'
},
RepaymentOptions:[{label:'一次性还款',value:'ALL'},{label:'全部分期',value:'STAGES'},{label:'部分先还加分期',value:'MIX'},{label:'其他',value:'OTHER'}],
rulesClientRepayment:{
type: [
{ required: true, message: '请选择还款方式', trigger: 'change',},
],
totalAmount: [
{ required: true, message: '请输入还款金额', trigger: 'change',},
{ pattern: /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0.\d{1,2}$/, message: '请输入2位小数金额', trigger: ['blur', 'change']}
],
paybackDate: [
{ required: true, message: '请选择还款截止日期', trigger: 'change',},
],
stagesDay: [
{ required: true, message: '请选择每期还款日期', trigger: 'change',},
],
partAmount: [
{ required: true, message: '请输入分期前偿还金额 ', trigger: 'change',},
{ pattern: /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0.\d{1,2}$/, message: '请输入2位小数金额', trigger: ['blur', 'change']}
],
partDate: [
{ required: true, message: '请选择分期前偿还日期', trigger: 'change',},
],
stagesNum: [
{ required: true, message: '请输入分期期数', trigger: 'change',},
{ pattern: /^[1-9]\d*$/, message: '只能输入正整数', trigger: ['blur', 'change']}
],
},
};
},
computed:{
@ -399,6 +537,14 @@ import api from "@/services/caseManagement";
this.$message.error(e.msg || e)
}
},
handleSubmitRepayment(){
this.$refs.ruleFormRepayment.validate((valid) => {
if (valid){
console.log(1111)
}
})
},
handleBack(){
// this.$route.query.sourcePage == 'mediationManagement'
this.$router.push('/mediation-management')
@ -569,9 +715,7 @@ import api from "@/services/caseManagement";
}
}
.case-detail-des{
}
}

View File

@ -0,0 +1,238 @@
<template>
<div class="case-repayment-certificate">
<div class="mb-16 flex-row justify-content-between">
<span class="f-weight500 f18">还款凭证</span>
<span class="cursor-pointer" @click="AddFlag = true"><i class="el-icon-plus"></i> 添加还款凭证</span>
</div>
<div v-if="AddFlag" class="case-detail-des flex-column mb-16 p-16 border-radius-8">
<div class="flex-column justify-content-between">
<el-form ref="ruleFormRepayment"
:model="repaymentObj"
:rules="rulesClientRepayment"
label-width="130px">
<el-form-item label="凭证金额" prop="amount">
<el-input class="inputpaddingtop2"
size="small"
placeholder="请输入凭证金额"
v-model="repaymentObj.amount">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="还款日期" prop="paybackTime">
<el-date-picker class="width100" size="small"
v-model="repaymentObj.paybackTime"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd HH:mm:ss"
format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="备注说明" prop="remark">
<el-input
size="small"
clearable
placeholder="请输入备注说明"
v-model="repaymentObj.remark">
</el-input>
</el-form-item>
<el-form-item label="凭证" prop="mediaPath">
<upload-file :file-list="fileList" :max-count="1"
:show-file-name="false"
uploadName="支持图片大小不超过10M"
accept=".jpg,.png,.jpeg"
:span="6"
:fileSize="10"
@handleUploadFile="handleUploadFile">
</upload-file>
</el-form-item>
<el-form-item label="">
<el-button @click="AddFlag = false" size="small">取消</el-button>
<el-button type="primary" @click="handleSubmitRepayment()" size="small">保存</el-button>
</el-form-item>
</el-form>
</div>
</div>
<div class="case-detail-des flex-column mb-16 p-16 border-radius-8" v-for="(proofitem,index) in ProofList" :key="index">
<div class="flex-column justify-content-between">
<el-form ref="ruleFormRepaymentUpdate"
:model="proofitem"
:rules="rulesClientRepayment"
label-width="130px">
<div class="flex-row justify-content-between mb-8">
<div class="pt-8 flex-column">
<span class="color-86909C">上传者<a></a></span>
<span class="color-86909C">上传时间<a>{{ proofitem.createAt }}</a></span>
</div>
<div>
<el-button type="primary" size="small">效验</el-button>
<el-button size="small" @click="updateRow = index">编辑</el-button>
</div>
</div>
<el-form-item label="凭证金额" prop="amount">
<el-input class="inputpaddingtop2" disabled
size="small"
placeholder="请输入凭证金额"
v-model="proofitem.amount">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="还款日期" prop="paybackTime">
<el-date-picker class="width100" size="small" disabled
v-model="proofitem.paybackTime"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd HH:mm:ss"
format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
<el-form-item label="备注说明" prop="remark">
<el-input disabled
size="small"
clearable
placeholder="请输入备注说明"
v-model="proofitem.remark">
</el-input>
</el-form-item>
<el-form-item label="凭证" prop="mediaPath">
<upload-file :file-list="[{url: proofitem.proofUrl}]" :max-count="1"
:readOnly="true"
:show-file-name="true"
uploadName="支持图片大小不超过10M"
accept=".jpg,.png,.jpeg"
:span="6"
:fileSize="10"
@handleUploadFile="handleUploadFile">
</upload-file>
</el-form-item>
<el-form-item label="" v-if="updateRow > 0 && index == updateRow">
<el-button @click="updateRow = 0" size="small">取消</el-button>
<el-button type="primary" @click="handleSubmitUpdate()" size="small">保存</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import api from "@/services/caseManagement";
export default {
components: {
uploadFile: () => import('@/components/uploadFile.vue'),//
},
props: {
eventDialog: {
type: Object,
default: () => {
return {}
},
},
},
data() {
return {
AddFlag:false,
updateRow:0,
repaymentObj:{
mediaPath:[]
},
RepaymentOptions:[{label:'一次性还款',value:'ALL'},{label:'全部分期',value:'STAGES'},{label:'部分先还加分期',value:'MIX'},{label:'其他',value:'OTHER'}],
rulesClientRepayment:{
amount: [
{ required: true, message: '请输入还款金额', trigger: 'change',},
{ pattern: /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0.\d{1,2}$/, message: '请输入2位小数金额', trigger: ['blur', 'change']}
],
paybackTime: [
{ required: true, message: '请选择还款日期', trigger: 'change',},
],
mediaPath: [
{ required: true, message: '请上传文件', trigger: 'change',},
],
},
ProofList:[],
fileList:[]
};
},
mounted () {
this.getProofList()
},
methods: {
handleSubmitUpdate(){
this.$refs.ruleFormRepayment.validate((valid) => {
if (valid){
this.repaymentObj.caseId = this.eventDialog.caseId
this.repaymentObj.proofUrl = this.repaymentObj.mediaPath[0]
api.gettraceProof_create(this.repaymentObj).then(res => {
if(!res.code){
this.updateRow = 0
this.getProofList()
}
})
}
})
},
handleSubmitRepayment(){
this.$refs.ruleFormRepayment.validate((valid) => {
if (valid){
this.repaymentObj.caseId = this.eventDialog.caseId
this.repaymentObj.proofUrl = this.repaymentObj.mediaPath[0]
api.gettraceProof_create(this.repaymentObj).then(res => {
if(!res.code){
this.AddFlag = false
this.getProofList()
}
})
}
})
},
getProofList(){
api.gettraceProof_list({caseId:this.eventDialog.caseId}).then(res => {
if(!res.code){
this.ProofList = res
this.ProofList.forEach(item =>{
this.fileList.push({
url: item.proofUrl,
})
item.mediaPath = [item.proofUrl]
})
}
})
},
handleUploadFile(fileList){
// console.log('',fileList)
fileList = JSON.parse(JSON.stringify(fileList))
this.fileList = fileList.map((item,i) => {
return {
url: item.url,
fileName:'上传',
previewUrl:item.previewUrl
}
})
this.repaymentObj.mediaPath = this.fileList.map((item) => item.url);
},
//
handleClose() {
this.$emit('update:eventTraDialog', null)
},
}
};
</script>
<style scoped lang="scss">
.case-repayment-certificate{
.case-detail-des{
border:solid 1px #E5E6EB;
.el-form-item{margin-bottom: 13px;}
.inputpaddingtop2{padding-top:3px}
}
}
</style>

View File

@ -0,0 +1,328 @@
<template>
<div class="case-repayment-certificate">
<div class="mb-16 flex-row justify-content-between">
<span class="f-weight500 f18">还款计划</span>
<span class="cursor-pointer" v-if="planList.length == 0" @click="updateFlag = true"><i class="el-icon-plus"></i> 添加还款计划</span>
<span class="cursor-pointer" v-else @click="updateFlag = true"><i class="el-icon-plus"></i> 编辑还款计划</span>
</div>
<div v-if="planList.length >0 && !updateFlag" class="case-detail-des flex-column mb-16 p-16 border-radius-8">
<div class="flex-column justify-content-between">
<el-form ref="ruleFormRepayment"
:model="repaymentObj"
:rules="rulesClientRepayment"
label-width="130px">
<el-form-item label="还款方式" prop="type">
<el-select v-model="repaymentObj.type" class="width100" disabled
placeholder="请选择还款方式" size="small">
<el-option
v-for="(item,index) in RepaymentOptions"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="还款金额" prop="totalAmount">
<el-input class="inputpaddingtop2" disabled
size="small"
placeholder="请输入还款金额"
v-model="repaymentObj.totalAmount"
@input="inputChange($event)">
<template slot="append"></template>
</el-input>
</el-form-item>
<!-- 枚举备注: ALL :一次性全部回款 STAGES :全部分期 MIX :混合部分先还加分期 OTHER :其他 -->
<el-form-item v-if="repaymentObj.type == 'MIX'" label="分期前偿还金额" prop="partAmount">
<el-input class="inputpaddingtop2" disabled
size="small"
placeholder="请输入分期前偿还金额"
v-model="repaymentObj.partAmount"
@input="inputChange($event)">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'MIX'" label="先还日期" prop="partDate">
<el-date-picker class="width100" size="small" disabled
v-model="repaymentObj.partDate"
type="date"
placeholder="选择先还日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'MIX'" label="分期部分金额" prop="productTypeId">
<el-input class="inputpaddingtop2"
size="small"
disabled
placeholder="分期部分金额"
v-model="repaymentObj.moneyAmount">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'STAGES' || repaymentObj.type == 'MIX'" label="分期期数" prop="stagesNum">
<el-input
size="small" disabled
placeholder="请输入分期期数"
v-model="repaymentObj.stagesNum"
@input="inputChange($event)">
</el-input>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'STAGES' || repaymentObj.type == 'MIX'" label="每期还款金额" prop="stagesAmount">
<el-input class="inputpaddingtop2"
size="small"
disabled
placeholder="每期还款金额"
v-model="repaymentObj.stagesAmount">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'STAGES' || repaymentObj.type == 'MIX'" label="每期还款日期" prop="stagesDay">
<el-select v-model="repaymentObj.stagesDay" class="width100" disabled
placeholder="请选择每期还款日期" size="small">
<el-option
v-for="(item, index) in 31"
:key="index"
:label="(index+1)+'日'"
:value="(index+1)">
</el-option>
</el-select>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'ALL' || repaymentObj.type == 'STAGES' || repaymentObj.type == 'MIX'" label="还款截止日期" prop="paybackDate">
<el-date-picker class="width100" size="small" disabled
v-model="repaymentObj.paybackDate"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="备注说明" prop="remark">
<el-input disabled
size="small"
clearable
placeholder="请输入备注说明"
v-model="repaymentObj.remark">
</el-input>
</el-form-item>
</el-form>
</div>
</div>
<div v-if="updateFlag" class="case-detail-des flex-column mb-16 p-16 border-radius-8">
<div class="flex-column justify-content-between">
<el-form ref="ruleFormRepayment"
:model="repaymentObj"
:rules="rulesClientRepayment"
label-width="130px">
<el-form-item label="还款方式" prop="type">
<el-select v-model="repaymentObj.type" class="width100"
placeholder="请选择还款方式" size="small">
<el-option
v-for="(item,index) in RepaymentOptions"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="还款金额" prop="totalAmount">
<el-input class="inputpaddingtop2"
size="small"
placeholder="请输入还款金额"
v-model="repaymentObj.totalAmount"
@input="inputChange($event)">
<template slot="append"></template>
</el-input>
</el-form-item>
<!-- 枚举备注: ALL :一次性全部回款 STAGES :全部分期 MIX :混合部分先还加分期 OTHER :其他 -->
<el-form-item v-if="repaymentObj.type == 'MIX'" label="分期前偿还金额" prop="partAmount">
<el-input class="inputpaddingtop2"
size="small"
placeholder="请输入分期前偿还金额"
v-model="repaymentObj.partAmount"
@input="inputChange($event)">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'MIX'" label="先还日期" prop="partDate">
<el-date-picker class="width100" size="small"
v-model="repaymentObj.partDate"
type="date"
placeholder="选择先还日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'MIX'" label="分期部分金额" prop="productTypeId">
<el-input class="inputpaddingtop2"
size="small"
disabled
placeholder="分期部分金额"
v-model="repaymentObj.moneyAmount">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'STAGES' || repaymentObj.type == 'MIX'" label="分期期数" prop="stagesNum">
<el-input
size="small"
placeholder="请输入分期期数"
v-model="repaymentObj.stagesNum"
@input="inputChange($event)">
</el-input>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'STAGES' || repaymentObj.type == 'MIX'" label="每期还款金额" prop="stagesAmount">
<el-input class="inputpaddingtop2"
size="small"
disabled
placeholder="每期还款金额"
v-model="repaymentObj.stagesAmount">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'STAGES' || repaymentObj.type == 'MIX'" label="每期还款日期" prop="stagesDay">
<el-select v-model="repaymentObj.stagesDay" class="width100"
placeholder="请选择每期还款日期" size="small">
<el-option
v-for="(item, index) in 31"
:key="index"
:label="(index+1)+'日'"
:value="(index+1)">
</el-option>
</el-select>
</el-form-item>
<el-form-item v-if="repaymentObj.type == 'ALL' || repaymentObj.type == 'STAGES' || repaymentObj.type == 'MIX'" label="还款截止日期" prop="paybackDate">
<el-date-picker class="width100" size="small"
v-model="repaymentObj.paybackDate"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="备注说明" prop="remark">
<el-input
size="small"
clearable
placeholder="请输入备注说明"
v-model="repaymentObj.remark">
</el-input>
</el-form-item>
<el-form-item label="">
<el-button @click="updateFlag = false" size="small">取消</el-button>
<el-button type="primary" @click="handleSubmitRepayment()" size="small">保存</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import api from "@/services/caseManagement";
export default {
components: {
},
props: {
eventDialog: {
type: Object,
default: () => {
return {}
},
},
},
data() {
return {
updateFlag:false,
repaymentObj:{type:'ALL'},
RepaymentOptions:[{label:'一次性还款',value:'ALL'},{label:'全部分期',value:'STAGES'},{label:'部分先还加分期',value:'MIX'},{label:'其他',value:'OTHER'}],
rulesClientRepayment:{
type: [
{ required: true, message: '请选择还款方式', trigger: 'change',},
],
totalAmount: [
{ required: true, message: '请输入还款金额', trigger: 'change',},
{ pattern: /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0.\d{1,2}$/, message: '请输入2位小数金额', trigger: ['blur', 'change']}
],
paybackDate: [
{ required: true, message: '请选择还款截止日期', trigger: 'change',},
],
stagesDay: [
{ required: true, message: '请选择每期还款日期', trigger: 'change',},
],
partAmount: [
{ required: true, message: '请输入分期前偿还金额 ', trigger: 'change',},
{ pattern: /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0.\d{1,2}$/, message: '请输入2位小数金额', trigger: ['blur', 'change']}
],
partDate: [
{ required: true, message: '请选择分期前偿还日期', trigger: 'change',},
],
stagesNum: [
{ required: true, message: '请输入分期期数', trigger: 'change',},
{ pattern: /^[1-9]\d*$/, message: '只能输入正整数', trigger: ['blur', 'change']}
],
},
planList:[]
};
},
mounted () {
this.getplanlist()
},
methods: {
handleSubmitRepayment(){
this.$refs.ruleFormRepayment.validate((valid) => {
if (valid){
this.repaymentObj.caseId = this.eventDialog.caseId
api.getcase_payback_save(this.repaymentObj).then(res => {
if(!res.code){
this.updateFlag = false
this.getplanlist()
}
})
}
})
},
getplanlist(){
api.getcase_payback_planlist({caseId:this.eventDialog.caseId}).then(res => {
if(!res.code){
this.planList = res
if(this.planList.length > 0 ){this.repaymentObj = this.planList[0]}
}
})
},
//
inputChange(){
if(this.repaymentObj.type == 'STAGES')
{
if(this.repaymentObj.totalAmount !='' &&this.repaymentObj.stagesNum !='' && this.repaymentObj.totalAmount !=undefined &&this.repaymentObj.stagesNum !=undefined)
{
this.repaymentObj.stagesAmount = ((this.repaymentObj.totalAmount*1)/(this.repaymentObj.stagesNum*1)).toFixed(2)
}
}
if(this.repaymentObj.type == 'MIX')
{
if(this.repaymentObj.totalAmount !='' &&this.repaymentObj.stagesNum !='' && this.repaymentObj.totalAmount !=undefined &&this.repaymentObj.stagesNum !=undefined)
{
this.repaymentObj.stagesAmount = ((this.repaymentObj.totalAmount*1 - this.repaymentObj.partAmount*1)/(this.repaymentObj.stagesNum*1)).toFixed(2)
}
}
},
//
handleClose() {
this.$emit('update:eventTraDialog', null)
},
}
};
</script>
<style scoped lang="scss">
.case-repayment-certificate{
.case-detail-des{
border:solid 1px #E5E6EB;
.el-form-item{ margin-bottom: 12px;}
.inputpaddingtop2{padding-top:3px}
}
}
</style>

View File

@ -82,39 +82,41 @@
</div>
<div class="case-pk-cont flex-column">
<div v-for="(item,index) in tableData" :key="index" class="case-pk-list">
<div class="flex-row justify-content-between mb-8">
<span class="f20 f-weight500">{{item.pkgName}}</span>
<span class="cursor-pointer" @click="jumpUrl(`/case-management?dataKey=casepack&pkgId=${item.id}`)">查看详情&nbsp;></span>
<el-scrollbar :style="'height:'+`${leftContentHeight}`+'px'">
<div v-for="(item,index) in tableData" :key="index" class="case-pk-list">
<div class="flex-row justify-content-between mb-8">
<span class="f20 f-weight500">{{item.pkgName}}</span>
<span class="cursor-pointer" @click="jumpUrl(`/case-management?dataKey=casepack&pkgId=${item.id}`)">查看详情&nbsp;></span>
</div>
<div class="flex-row mb-16">
<span>{{item.entrustingAgencyName}}</span>
<span class="ml-16">委案日期{{item.planStartTime | formaDate('yyyy-MM-dd')}}</span>
</div>
<div class="flex-row justify-content-between case-pk-num mb-16">
<span>
<p><a>{{item.caseTotal}}</a></p>
案件总量
</span>
<span>
<p><a>{{item.assignTotal}}</a></p>
已分案件数
</span>
<span>
<p><a>{{item.caseTotal - item.assignTotal}}</a></p>
待分案件数
</span>
<span>
<p><a>{{item.months}}</a>个月</p>
委案期限
</span>
</div>
<div class="flex-row justify-content-end mb-8">
<el-button size="mini" type="primary" @click="handleCaseAllocation(item)">案件分配</el-button>
<!-- <el-button size="mini" @click="handleEdit(scope)">预设还款方案</el-button> -->
<el-button size="mini" @click="handleDelete(item)">删除</el-button>
</div>
</div>
<div class="flex-row mb-16">
<span>{{item.entrustingAgencyName}}</span>
<span class="ml-16">委案日期{{item.planStartTime | formaDate('yyyy-MM-dd')}}</span>
</div>
<div class="flex-row justify-content-between case-pk-num mb-16">
<span>
<p><a>{{item.caseTotal}}</a></p>
案件总量
</span>
<span>
<p><a>{{item.assignTotal}}</a></p>
已分案件数
</span>
<span>
<p><a>{{item.caseTotal - item.assignTotal}}</a></p>
待分案件数
</span>
<span>
<p><a>{{item.months}}</a>个月</p>
委案期限
</span>
</div>
<div class="flex-row justify-content-end mb-8">
<el-button size="mini" type="primary" @click="handleCaseAllocation(item)">案件分配</el-button>
<!-- <el-button size="mini" @click="handleEdit(scope)">预设还款方案</el-button> -->
<el-button size="mini" @click="handleDelete(item)">删除</el-button>
</div>
</div>
</el-scrollbar>
</div>
</div>
<div class="border-radius-4 flex-column casework3">
@ -156,28 +158,28 @@
</div>
<div class="case-pk-cont">
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:0,title:'短信发送追踪'}">
<span>短信发送追踪</span><span><a>1</a>/<a>{{traceData.smsTrackingCount}}</a></span>
<span>短信发送追踪</span><span><a>{{traceData.smsTrackingCount.failed}}</a>/<a>{{traceData.smsTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:1,title:'外呼事项追踪'}">
<span>外呼事项追踪</span><span><a>1</a>/<a>{{traceData.intelligentCallTrackingCount}}</a></span>
<span>外呼事项追踪</span><span><a>{{traceData.intelligentCallTrackingCount.failed}}</a>/<a>{{traceData.intelligentCallTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:2,title:'视频调解追踪'}">
<span>视频调解追踪</span><span><a>1</a>/<a>{{traceData.videoAppointmentTrackingCount}}</a></span>
<span>视频调解追踪</span><span><a>{{traceData.videoAppointmentTrackingCount.failed}}</a>/<a>{{traceData.videoAppointmentTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:3,title:'文书生成追踪'}">
<span>文书生成追踪</span><span><a>1</a>/<a>{{traceData.documentGenerationTrackingCount}}</a></span>
<span>文书生成追踪</span><span><a>{{traceData.videoAppointmentTrackingCount.failed}}</a>/<a>{{traceData.videoAppointmentTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:4,title:'文书签字追踪'}">
<span>文书签字追踪</span><span><a>1</a>/<a>{{traceData.documentSignatureTrackingCount}}</a></span>
<span>文书签字追踪</span><span><a>{{traceData.videoAppointmentTrackingCount.failed}}</a>/<a>{{traceData.videoAppointmentTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:5,title:'文书签章追踪'}">
<span>文书签章追踪</span><span><a>1</a>/<a>{{traceData.electronicSealTrackingCount}}</a></span>
<span>文书签章追踪</span><span><a>{{traceData.electronicSealTrackingCount.failed}}</a>/<a>{{traceData.electronicSealTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:6,title:'文书送达追踪'}">
<span>文书送达追踪</span><span><a>1</a>/<a>{{traceData.documentDeliveryTrackingCount}}</a></span>
<span>文书送达追踪</span><span><a>{{traceData.documentDeliveryTrackingCount.failed}}</a>/<a>{{traceData.documentDeliveryTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:7,title:'还款凭证登记'}">
<span>还款凭证登记</span><span><a>1</a>/<a>{{traceData.repaymentRecordTrackingCount}}</a></span>
<span>还款凭证登记</span><span><a>{{traceData.repaymentRecordTrackingCount.failed}}</a>/<a>{{traceData.repaymentRecordTrackingCount.total}}</a></span>
</div>
</div>
</div>
@ -225,7 +227,40 @@
importCaseDialog:null,//
myEcharts: null,
traceData:{},
traceData:{
"smsTrackingCount": {
"total": 0,
"failed": 0
},
"intelligentCallTrackingCount": {
"total": 0,
"failed": 0
},
"repaymentRecordTrackingCount": {
"total": 0,
"failed": 0
},
"documentSignatureTrackingCount": {
"total": 1,
"failed": 0
},
"documentDeliveryTrackingCount": {
"total": 0,
"failed": 0
},
"electronicSealTrackingCount": {
"total": 0,
"failed": 0
},
"documentGenerationTrackingCount": {
"total": 0,
"failed": 0
},
"videoAppointmentTrackingCount": {
"total": 0,
"failed": 0
}
},
};
},
@ -238,6 +273,12 @@
let oh = document.documentElement.clientHeight;
return oh-66
},
// drawer
leftContentHeight(){
let oh = document.documentElement.clientHeight;
return oh-256
}
},
mounted(){

View File

@ -82,39 +82,41 @@
</div>
<div class="case-pk-cont flex-column">
<div v-for="(item,index) in tableData" :key="index" class="case-pk-list">
<div class="flex-row justify-content-between mb-8">
<span class="f20 f-weight500">{{item.pkgName}}</span>
<span class="cursor-pointer" @click="jumpUrl(`/case-management?dataKey=casepack&pkgId=${item.id}`)">查看详情&nbsp;></span>
<el-scrollbar :style="'height:'+`${leftContentHeight}`+'px'">
<div v-for="(item,index) in tableData" :key="index" class="case-pk-list">
<div class="flex-row justify-content-between mb-8">
<span class="f20 f-weight500">{{item.pkgName}}</span>
<span class="cursor-pointer" @click="jumpUrl(`/case-management?dataKey=casepack&pkgId=${item.id}`)">查看详情&nbsp;></span>
</div>
<div class="flex-row mb-16">
<span>{{item.entrustingAgencyName}}</span>
<span class="ml-16">委案日期{{item.planStartTime | formaDate('yyyy-MM-dd')}}</span>
</div>
<div class="flex-row justify-content-between case-pk-num mb-16">
<span>
<p><a>{{item.caseTotal}}</a></p>
案件总量
</span>
<span>
<p><a>{{item.assignTotal}}</a></p>
已分案件数
</span>
<span>
<p><a>{{item.caseTotal - item.assignTotal}}</a></p>
待分案件数
</span>
<span>
<p><a>{{item.months}}</a>个月</p>
委案期限
</span>
</div>
<div class="flex-row justify-content-end mb-8">
<el-button size="mini" type="primary" @click="handleCaseAllocation(item)">案件分配</el-button>
<!-- <el-button size="mini" @click="handleEdit(scope)">预设还款方案</el-button> -->
<el-button size="mini" @click="handleDelete(item)">删除</el-button>
</div>
</div>
<div class="flex-row mb-16">
<span>{{item.entrustingAgencyName}}</span>
<span class="ml-16">委案日期{{item.planStartTime | formaDate('yyyy-MM-dd')}}</span>
</div>
<div class="flex-row justify-content-between case-pk-num mb-16">
<span>
<p><a>{{item.caseTotal}}</a></p>
案件总量
</span>
<span>
<p><a>{{item.assignTotal}}</a></p>
已分案件数
</span>
<span>
<p><a>{{item.caseTotal - item.assignTotal}}</a></p>
待分案件数
</span>
<span>
<p><a>{{item.months}}</a>个月</p>
委案期限
</span>
</div>
<div class="flex-row justify-content-end mb-8">
<el-button size="mini" type="primary" @click="handleCaseAllocation(item)">案件分配</el-button>
<!-- <el-button size="mini" @click="handleEdit(scope)">预设还款方案</el-button> -->
<el-button size="mini" @click="handleDelete(item)">删除</el-button>
</div>
</div>
</el-scrollbar>
</div>
</div>
<div class="border-radius-4 flex-column casework3">
@ -156,28 +158,28 @@
</div>
<div class="case-pk-cont">
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:0,title:'短信发送追踪'}">
<span>短信发送追踪</span><span><a>1</a>/<a>2</a></span>
<span>短信发送追踪</span><span><a>{{traceData.smsTrackingCount.failed}}</a>/<a>{{traceData.smsTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:1,title:'外呼事项追踪'}">
<span>外呼事项追踪</span><span><a>1</a>/<a>2</a></span>
<span>外呼事项追踪</span><span><a>{{traceData.intelligentCallTrackingCount.failed}}</a>/<a>{{traceData.intelligentCallTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:2,title:'视频调解追踪'}">
<span>视频调解追踪</span><span><a>1</a>/<a>2</a></span>
<span>视频调解追踪</span><span><a>{{traceData.videoAppointmentTrackingCount.failed}}</a>/<a>{{traceData.videoAppointmentTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:3,title:'文书生成追踪'}">
<span>文书生成追踪</span><span><a>1</a>/<a>2</a></span>
<span>文书生成追踪</span><span><a>{{traceData.videoAppointmentTrackingCount.failed}}</a>/<a>{{traceData.videoAppointmentTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:4,title:'文书签字追踪'}">
<span>文书签字追踪</span><span><a>1</a>/<a>2</a></span>
<span>文书签字追踪</span><span><a>{{traceData.videoAppointmentTrackingCount.failed}}</a>/<a>{{traceData.videoAppointmentTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:5,title:'文书签章追踪'}">
<span>文书签章追踪</span><span><a>1</a>/<a>2</a></span>
<span>文书签章追踪</span><span><a>{{traceData.electronicSealTrackingCount.failed}}</a>/<a>{{traceData.electronicSealTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:6,title:'文书送达追踪'}">
<span>文书送达追踪</span><span><a>1</a>/<a>2</a></span>
<span>文书送达追踪</span><span><a>{{traceData.documentDeliveryTrackingCount.failed}}</a>/<a>{{traceData.documentDeliveryTrackingCount.total}}</a></span>
</div>
<div class="flex-row justify-content-between cursor-pointer" @click="eventTraDialog={traceType:7,title:'还款凭证登记'}">
<span>还款凭证登记</span><span><a>1</a>/<a>2</a></span>
<span>还款凭证登记</span><span><a>{{traceData.repaymentRecordTrackingCount.failed}}</a>/<a>{{traceData.repaymentRecordTrackingCount.total}}</a></span>
</div>
</div>
</div>
@ -225,6 +227,40 @@
importCaseDialog:null,//
myEcharts: null,
traceData:{
"smsTrackingCount": {
"total": 0,
"failed": 0
},
"intelligentCallTrackingCount": {
"total": 0,
"failed": 0
},
"repaymentRecordTrackingCount": {
"total": 0,
"failed": 0
},
"documentSignatureTrackingCount": {
"total": 1,
"failed": 0
},
"documentDeliveryTrackingCount": {
"total": 0,
"failed": 0
},
"electronicSealTrackingCount": {
"total": 0,
"failed": 0
},
"documentGenerationTrackingCount": {
"total": 0,
"failed": 0
},
"videoAppointmentTrackingCount": {
"total": 0,
"failed": 0
}
},
};
},
@ -237,7 +273,13 @@
let oh = document.documentElement.clientHeight;
return oh-66
}
},
// drawer
leftContentHeight(){
let oh = document.documentElement.clientHeight;
return oh-256
}
},
mounted(){
this.getCaseapkList()
@ -282,7 +324,7 @@
getstatistic_trace(){
workApi.statistic_trace({current:1,size:100}).then(res => {
if (!res.code) {
this.tableData = res.records;
this.traceData = res;
}
})
},

View File

@ -100,6 +100,24 @@ const caseManagementApi = {
return service.service.post(`${apiMediate}cases/caseInfo/getNextCaseById`, data)
},
// 回款计划列表,没有分页
getcase_payback_planlist: data => {
return service.service.post(`${apiMediate}api/case_payback_plan/list`, data)
},
// 新增回款计划
getcase_payback_save: data => {
return service.service.post(`${apiMediate}api/case_payback_plan/save`, data)
},
// 还款凭证列表
gettraceProof_list: data => {
return service.service.post(`${apiMediate}api/trace/traceProof/list`, data)
},
// 上传还款凭证
gettraceProof_create: data => {
return service.service.post(`${apiMediate}api/trace/traceProof/create`, data)
},