案件材料部分内容

This commit is contained in:
tdg930622 2024-12-25 17:06:25 +08:00
parent 9438f32682
commit d33240b322
7 changed files with 365 additions and 68 deletions

View File

@ -208,24 +208,25 @@
<!-- 案件材料 --> <!-- 案件材料 -->
<div v-if="leftActive == 3" class="case-materials-person"> <div v-if="leftActive == 3" class="case-materials-person">
<div class="mb-16 flex-row justify-content-between"> <caseMaterialLeft :caseId="caseId" />
<span class="f-weight500 f18">案件材料</span> <!-- <div class="mb-16 flex-row justify-content-between">-->
<span class="cursor-pointer"><i class="el-icon-plus"></i> 上传案件材料</span> <!-- <span class="f-weight500 f18">案件材料</span>-->
</div> <!-- <span class="cursor-pointer"><i class="el-icon-plus"></i> 上传案件材料</span>-->
<div class="case-detail-des flex-column mb-16"> <!-- </div>-->
<div class="background-color-F5F5F5 p-16 flex-row border-radius-8"> <!-- <div class="case-detail-des flex-column mb-16">-->
<a class="case-img"><img :src="this.$util.reg_img('m-info1.pdf')"/></a> <!-- <div class="background-color-F5F5F5 p-16 flex-row border-radius-8">-->
<div class="flex-column"> <!-- <a class="case-img"><img :src="this.$util.reg_img('m-info1.pdf')"/></a>-->
<a class="mt-8 f-weight500">起诉状</a> <!-- <div class="flex-column">-->
<a class="color-86909C">张三 2024-09-09</a> <!-- <a class="mt-8 f-weight500">起诉状</a>-->
</div> <!-- <a class="color-86909C">张三 2024-09-09</a>-->
</div> <!-- </div>-->
<div class="color-86909C mt-8"> <!-- </div>-->
<a class="mr-16 ml-16 cursor-pointer"><i class="el-icon-view"></i>预览</a> <!-- <div class="color-86909C mt-8">-->
<a class="mr-16 cursor-pointer"><i class="el-icon-delete"></i>删除</a> <!-- <a class="mr-16 ml-16 cursor-pointer"><i class="el-icon-view"></i>预览</a>-->
<a class="mr-16 cursor-pointer"><i class="el-icon-download"></i>下载</a> <!-- <a class="mr-16 cursor-pointer"><i class="el-icon-delete"></i>删除</a>-->
</div> <!-- <a class="mr-16 cursor-pointer"><i class="el-icon-download"></i>下载</a>-->
</div> <!-- </div>-->
<!-- </div>-->
</div> </div>
<!-- 案件文书 --> <!-- 案件文书 -->
@ -361,33 +362,7 @@
</div> </div>
<!-- 案件材料 --> <!-- 案件材料 -->
<div v-if="rightActive == 3" class="case-materials-record"> <div v-if="rightActive == 3" class="case-materials-record">
<div class="flex-row justify-content-between"> <caseMaterial :caseId="caseId" />
<span class="btn-communication background-color-fff f-weight500 p-8 border-radius-8 cursor-pointer"
@click="caseFileVisible={caseId:caseId}">
<i class="el-icon-plus"></i>上传案件材料
</span>
</div>
<div class="flex-row justify-content-between background-color-fff p-16 border-radius-8 mt-16">
<span class="width120px f-weight500">材料类型</span>
<span class="width200px f-weight500">文件</span>
<span class="width120px f-weight500">操作人</span>
<span class="width120px f-weight500">操作时间</span>
<span class="width180px f-weight500">操作</span>
</div>
<el-scrollbar :style="'height:'+`${OfficecontentHeight}`+'px'">
<div class="flex-row justify-content-between background-color-fff p-16 border-radius-8 mt-16">
<span class="width120px">起诉状</span>
<span class="width200px">dsadasdsadada.pdf</span>
<span class="width120px">张三</span>
<span class="width120px">2024-09-09 12:12:12</span>
<span class="width180px flex-row">
<a>预览</a>
<a>删除</a>
<a>文件下载</a>
</span>
</div>
</el-scrollbar>
</div> </div>
<!-- 案件日志 --> <!-- 案件日志 -->
<div v-if="rightActive == 5" class="case-log-record"> <div v-if="rightActive == 5" class="case-log-record">
@ -420,27 +395,24 @@
</div> </div>
<!-- 视频预约 --> <!-- 视频预约 -->
<VideoReservationDialog v-if="VideoDialog" :eventDialog.sync="VideoDialog"/> <VideoReservationDialog v-if="VideoDialog" :eventDialog.sync="VideoDialog"/>
<!-- 案件材料上传 -->
<caseFileDialog v-if="caseFileVisible" :eventDialog.sync="caseFileVisible"/>
</div> </div>
</template> </template>
<script> <script>
import api from "@/services/caseManagement"; import api from "@/services/caseManagement";
import caseMaterial from "@/services/caseMaterial";
export default { export default {
components: { components: {
uploadFile: () => import('@/components/uploadFile.vue'),// uploadFile: () => import('@/components/uploadFile.vue'),//
RepaymentSchedule: () => import('./RepaymentSchedule.vue'),// RepaymentSchedule: () => import('./RepaymentSchedule.vue'),//
RepaymentCertificate: () => import('./RepaymentCertificate.vue'),// RepaymentCertificate: () => import('./RepaymentCertificate.vue'),//
VideoReservationDialog: () => import('./VideoReservationDialog'),// VideoReservationDialog: () => import('./VideoReservationDialog'),//
caseFileDialog: () => import('./caseFileDialog'),// caseMaterial: () => import('./caseMaterial'),//
caseMaterialLeft: () => import('./caseMaterialLeft'),//
}, },
data() { data() {
return { return {
VideoDialog: null, VideoDialog: null,
eventDialog: {caseId: this.$route.query.caseId}, eventDialog: {caseId: this.$route.query.caseId},
caseFileVisible: null,
leftActive: 1, leftActive: 1,
rightActive: 1, rightActive: 1,
fileList: [], fileList: [],
@ -919,6 +891,4 @@ export default {
} }
</style> </style>

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<el-dialog title="视频预约" :visible="true" width="500px" append-to-body :close-on-click-modal="false" <el-dialog title="上传文件" :visible="true" width="500px" append-to-body :close-on-click-modal="false"
@close="handleClose"> @close="handleClose">
<div class="dialog-content dialog-office-batch"> <div class="dialog-content dialog-office-batch">
<div class="p-16 pr-40"> <div class="p-16 pr-40">
@ -22,7 +22,7 @@
<upload-file :file-list="fileList" :max-count="1" <upload-file :file-list="fileList" :max-count="1"
:show-file-name="false" :show-file-name="false"
uploadName="" uploadName=""
accept=".jpg,.png,.jpeg,.pdf,.docx" accept=".jpg,.png,.jpeg,.pdf"
:span="6" :span="6"
:fileSize="50" :fileSize="50"
@handleUploadFile="handleUploadFile"> @handleUploadFile="handleUploadFile">
@ -31,7 +31,7 @@
<el-form-item label="上传要求:"> <el-form-item label="上传要求:">
<div style="line-height: 20px;padding-top: 10px"> <div style="line-height: 20px;padding-top: 10px">
<div>请知悉</div> <div>请知悉</div>
<div>请上传图片或pdf或word格式材料单个文件需要在0KB以上50MB以内;文件名称中请勿包含换行符空格tab#&V:?"#*|&"<>%+'等特色字符</div> <div>请上传图片或pdf材料单个文件需要在0KB以上50MB以内;文件名称中请勿包含换行符空格tab#&V:?"#*|&"<>%+'等特色字符</div>
<div>文件名称不超过45个字</div> <div>文件名称不超过45个字</div>
</div> </div>
</el-form-item> </el-form-item>
@ -48,7 +48,6 @@
</div> </div>
</template> </template>
<script> <script>
import videoTelephone from "@/services/videoTelephone";
import caseMaterial from "@/services/caseMaterial"; import caseMaterial from "@/services/caseMaterial";
export default { export default {
components: { components: {
@ -109,9 +108,9 @@ export default {
objectName: item.objectName objectName: item.objectName
} }
}) })
this.repaymentObj.url = this.fileList.length?this.fileList[0].url : ''; this.repaymentObj.url = this.fileList.length?this.fileList[0].fileName : '';
this.repaymentObj.name = this.fileList.length?this.fileList[0].objectName : ''; this.repaymentObj.name = this.fileList.length?this.fileList[0].objectName : '';
console.log(this.repaymentObj, '---this.repaymentObj', this.fileList) // console.log(this.repaymentObj, '---this.repaymentObj', this.fileList)
}, },
handleClose() { handleClose() {
this.$emit('update:eventDialog', null) this.$emit('update:eventDialog', null)
@ -122,7 +121,7 @@ export default {
if (valid) { if (valid) {
this.repaymentObj.caseId = this.eventDialog.caseId; this.repaymentObj.caseId = this.eventDialog.caseId;
caseMaterial.addCaseFile(this.repaymentObj).then(res => { caseMaterial.addCaseFile(this.repaymentObj).then(res => {
// this.$parent.getDataList(1) this.$parent.getList()
this.handleClose() this.handleClose()
this.$message.success("操作成功"); this.$message.success("操作成功");
}) })

View File

@ -0,0 +1,152 @@
<template>
<div>
<div class="flex-row justify-content-between">
<span class="btn-communication background-color-fff f-weight500 p-8 border-radius-8 cursor-pointer"
@click="caseFileVisible={caseId:caseId}">
<i class="el-icon-plus"></i>上传案件材料
</span>
</div>
<div class="flex-row justify-content-between background-color-fff p-16 border-radius-8 mt-16">
<span class="width120px f-weight500">材料类型</span>
<span class="width200px f-weight500">文件</span>
<span class="width120px f-weight500">操作人</span>
<span class="width120px f-weight500">操作时间</span>
<span class="width180px f-weight500">操作</span>
</div>
<el-scrollbar :style="'height:'+`${OfficecontentHeight}`+'px'">
<div class="flex-row justify-content-between background-color-fff p-16 border-radius-8 mt-16"
v-for="(item, index) in tableData" :key="index">
<span class="width120px">{{item.materialType}}</span>
<span class="width200px">{{item.name}}</span>
<span class="width120px">{{item.createBy}}</span>
<span class="width120px">{{item.createAt}}</span>
<span class="width180px flex-row">
<div class="mr-8 cursor-pointer" @click="handlePreview(item)">预览</div>
<div class="mr-8 cursor-pointer" @click="handleDelete(item)">删除</div>
<div class="mr-8 cursor-pointer" @click="handleDownload(item)">文件下载</div>
</span>
</div>
</el-scrollbar>
<!-- 案件材料上传 -->
<caseFileDialog v-if="caseFileVisible" :eventDialog.sync="caseFileVisible"/>
<!-- 大图预览 -->
<dialogPreview v-if="editImgFlag" :visible.sync="editImgFlag" :previewUrl="previewPath" />
<pdfPreview v-if="editPdfFlag" :visible.sync="editPdfFlag" :previewUrl="previewPath"/>
<videoPreview v-if="editMp4Flag" :visible.sync="editMp4Flag" :previewUrl="previewPath"/>
</div>
</template>
<script>
import caseMaterial from "@/services/caseMaterial";
import fetchApi from "@/services/fetchApi";
export default {
components: {
caseFileDialog: () => import('./caseFileDialog'),//
dialogPreview: () => import('@/components/dialogPreview'),
pdfPreview: () => import('@/components/pdfPreview.vue'),//PDF
videoPreview: () => import('@/components/videoPreview.vue'),//
},
name: "caseMaterial",
props: {
caseId: {
type: String,
default: () => {
return ''
},
},
},
data() {
return{
caseFileVisible: null,
tableData: [],
total: 0,
editPdfFlag:false,
editMp4Flag:false,
editImgFlag: false,
previewPath:'',
}
},
computed:{
// drawer
OfficecontentHeight() {
let oh = document.documentElement.clientHeight;
return oh - 185
},
},
async created() {
await this.getList();
},
methods:{
//
getList() {
let dataJson = {
size: 9999,
current: 1,
caseId: this.caseId
}
caseMaterial.getCaseFileList(dataJson).then(res => {
if (!res.code) {
this.tableData = res.records;
this.total = res.total;
}
})
},
async handlePreview(item) {
let previewUrl = `/mediate/minio/preview/${item.url}`
if(item.url.includes('http')){previewUrl = item.url}
let analysisType = this.$util.getFileType(item.url);
if (analysisType === 'image'){
this.previewPath = previewUrl
this.editImgFlag = true;
}else if(analysisType.toLowerCase() === 'mp4' || analysisType.toLowerCase() === 'video'){
this.previewPath = previewUrl
this.editMp4Flag = true;
}else if(analysisType.toLowerCase() === 'pdf'){
this.previewPath = previewUrl
this.editPdfFlag = true;
}else {
// let res = await commonFun.viewFile2({url: item.url})
// window.open(`${res}`, '_target')
}
},
handleDelete(item) {
this.$confirm("请确定是否删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
if(!this.$clickThrottle()) { return }//
let data = {id: item.id}
caseMaterial.deleteCaseFileById(data).then((res) => {
this.$message.success("成功");
this.getList()
});
}).catch(() => {});
},
handleDownload(item) {
fetchApi.downFile({
path: item.url,
fileName: item.name
}).then(res => {
console.log(res)
this.$util.downloadFileByBlob(res, item.name)
})
}
}
}
</script>
<style scoped lang="scss">
.width120px {
width: 140px;
}
.width180px {
width: 220px;
}
.width200px {
width: calc(50% - 320px);
}
</style>

View File

@ -0,0 +1,168 @@
<template>
<div>
<div class="mb-16 flex-row justify-content-between">
<span class="f-weight500 f18">案件材料</span>
<span class="cursor-pointer" @click="caseFileVisible={caseId:caseId}">
<i class="el-icon-plus"></i> 上传案件材料
</span>
</div>
<div class="case-detail-des flex-column mb-16" v-for="(item, index) in tableData" :key="index">
<div class="background-color-F5F5F5 p-16 flex-row border-radius-8">
<a class="case-img"><img :src="reg_img(item.url)"/></a>
<div class="flex-column">
<a class="mt-8 f-weight500">{{item.materialType}}</a>
<a class="color-86909C">{{item.createBy + ' ' + item.createAt}}</a>
</div>
</div>
<div class="color-86909C mt-8">
<a class="mr-16 ml-16 cursor-pointer" @click="handlePreview(item)"><i class="el-icon-view"></i>预览</a>
<a class="mr-16 cursor-pointer" @click="handleDelete(item)"><i class="el-icon-delete"></i>删除</a>
<a class="mr-16 cursor-pointer" @click="handleDownload(item)"><i class="el-icon-download"></i>下载</a>
</div>
</div>
<!-- 案件材料上传 -->
<caseFileDialog v-if="caseFileVisible" :eventDialog.sync="caseFileVisible"/>
<!-- 大图预览 -->
<dialogPreview v-if="editImgFlag" :visible.sync="editImgFlag" :previewUrl="previewPath" />
<pdfPreview v-if="editPdfFlag" :visible.sync="editPdfFlag" :previewUrl="previewPath"/>
<videoPreview v-if="editMp4Flag" :visible.sync="editMp4Flag" :previewUrl="previewPath"/>
</div>
</template>
<script>
import caseMaterial from "@/services/caseMaterial";
import fetchApi from "@/services/fetchApi";
export default {
components: {
caseFileDialog: () => import('./caseFileDialog'),//
dialogPreview: () => import('@/components/dialogPreview'),
pdfPreview: () => import('@/components/pdfPreview.vue'),//PDF
videoPreview: () => import('@/components/videoPreview.vue'),//
},
name: "caseMaterial",
props: {
caseId: {
type: String,
default: () => {
return ''
},
},
},
data() {
return{
caseFileVisible: null,
tableData: [],
total: 0,
editPdfFlag:false,
editMp4Flag:false,
editImgFlag: false,
previewPath:'',
}
},
computed:{
// drawer
OfficecontentHeight() {
let oh = document.documentElement.clientHeight;
return oh - 185
},
},
async created() {
await this.getList();
},
methods:{
reg_img(fileUrl) {
if(fileUrl==null||fileUrl=='') {
return fileUrl
}
// console.log(/.(xls|xlsx)$/.test(fileUrl.toLowerCase()),'111')
if(/.(pdf)$/.test(fileUrl.toLowerCase())) {
return require('@/assets/image/util/pdf_img.jpg')
}
else if(/.(xls|xlsx)$/.test(fileUrl.toLowerCase())) {
return require('@/assets/image/util/excel_img.jpg')
}
else if(/.(doc|docx)$/.test(fileUrl.toLowerCase())) {
return require('@/assets/image/util/word_img.jpg')
}
else if(/.(zip|rar)$/.test(fileUrl.toLowerCase())) {
return require('@/assets/image/util/yswj.jpg')
}
else {
let previewUrl = `/mediate/minio/preview/${fileUrl}`
// return service.service.serviceurl+fileUrl
return previewUrl
}
},
//
getList() {
let dataJson = {
size: 9999,
current: 1,
caseId: this.caseId
}
caseMaterial.getCaseFileList(dataJson).then(res => {
if (!res.code) {
this.tableData = res.records;
this.total = res.total;
}
})
},
async handlePreview(item) {
let previewUrl = `/mediate/minio/preview/${item.url}`
if(item.url.includes('http')){previewUrl = item.url}
let analysisType = this.$util.getFileType(item.url);
if (analysisType === 'image'){
this.previewPath = previewUrl
this.editImgFlag = true;
}else if(analysisType.toLowerCase() === 'mp4' || analysisType.toLowerCase() === 'video'){
this.previewPath = previewUrl
this.editMp4Flag = true;
}else if(analysisType.toLowerCase() === 'pdf'){
this.previewPath = previewUrl
this.editPdfFlag = true;
}else {
// let res = await commonFun.viewFile2({url: item.url})
// window.open(`${res}`, '_target')
}
},
handleDelete(item) {
this.$confirm("请确定是否删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
if(!this.$clickThrottle()) { return }//
let data = {id: item.id}
caseMaterial.deleteCaseFileById(data).then((res) => {
this.$message.success("成功");
this.getList()
});
}).catch(() => {});
},
handleDownload(item) {
fetchApi.downFile({
path: item.url,
fileName: item.name
}).then(res => {
console.log(res)
this.$util.downloadFileByBlob(res, item.name)
})
}
}
}
</script>
<style scoped lang="scss">
.width120px {
width: 140px;
}
.width180px {
width: 220px;
}
.width200px {
width: calc(50% - 320px);
}
</style>

View File

@ -1,5 +1,5 @@
import service from "./index"; import service from "./index";
const api = '/mediate/cases/caseFile/' const api = '/mediate/api/cases/caseFile/'
// caseMaterial // caseMaterial
const apiCaseMaterial = { const apiCaseMaterial = {
// 列表 // 列表

View File

@ -34,7 +34,14 @@ const fetchApi = {
getMinioToken(data) { getMinioToken(data) {
return service.service.post(`${apiAdmin}minio/getMinioToken`, data) return service.service.post(`${apiAdmin}minio/getMinioToken`, data)
}, },
//========================end::上传相关====================================== //========================end::上传相关======================================
// 文件下载
downFile: data => {
return service.service.post(`${apiAdmin}upload/down`, data)
},
// 文件预览
viewFile: data => {
return service.postFile(`${apiAdmin}upload/view`, data)
},
} }
export default fetchApi; export default fetchApi;

View File

@ -15,18 +15,18 @@ const util = {
* @param filename {String} 文件名称 * @param filename {String} 文件名称
*/ */
downloadFileByBlob: (data, filename) => { downloadFileByBlob: (data, filename) => {
console.log(111111) // console.log(111111)
// if (!data) { if (!data) {
// console.log(123) // console.log(123)
// return false; return false;
// } }
if (!!window.ActiveXObject || "ActiveXObject" in window) { if (!!window.ActiveXObject || "ActiveXObject" in window) {
window.navigator.msSaveOrOpenBlob(new Blob([data]), filename); window.navigator.msSaveOrOpenBlob(new Blob([data]), filename);
console.log(22222) console.log(22222)
} else { } else {
console.log(33333) console.log(33333)
const url = window.URL.createObjectURL(new Blob([data])); const url = window.URL.createObjectURL(new Blob([data]));
console.log('下载',url) // console.log('下载',url)
const link = document.createElement("a"); const link = document.createElement("a");
link.style.display = "none"; link.style.display = "none";
link.href = url; link.href = url;
@ -169,6 +169,7 @@ const util = {
}, },
// 验证图片类型 // 验证图片类型
reg_img(fileUrl) { reg_img(fileUrl) {
console.log(fileUrl,'---fileUrl')
if(fileUrl==null||fileUrl=='') { if(fileUrl==null||fileUrl=='') {
return fileUrl return fileUrl
} }