文书生成、签字、签章

This commit is contained in:
liuxi 2025-01-06 16:09:41 +08:00
parent bec9446859
commit 13efcf95fe
13 changed files with 857 additions and 399 deletions

View File

@ -26,4 +26,12 @@ $--button-primary-border-color: #1960F4 !default;
color: #FFFFFF;
}
.el-popover{padding: 0 !important;
.el-popover__title{
padding: 12px 10px;
border-bottom: solid 1px #E5E6EB;
margin-bottom: 2px;
}
}
@import "~element-ui/packages/theme-chalk/src/index";

View File

@ -1,330 +0,0 @@
<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 = `/mediate/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

@ -0,0 +1,218 @@
<template>
<div class="upload-single-file-wrap">
<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>
</el-upload>
<!-- <div class="f12 text-center color-text-regular line-height-20">{{uploadName}}</div> -->
</div>
</template>
<script>
import caseManagement from "@/services/caseManagement";
export default {
name: "uploadFile",
components: {
},
props: {
caseId: {
// ID
type: String,
default: ''
},
documentType: {
//
type: String,
default: ''
},
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:'',
}
},
methods: {
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)
formData.append('caseId', this.caseId)
formData.append('documentType', this.documentType)
// caseManagement.customFileUpload({caseId:this.caseId,documentType:Filedata.documentType,file:Filedata.fileObj.url}).then((res) => {
// this.$message.success("");
// this.getWritCaseList()
// });
// let uploadFileRes = await fetchApi.uploadFile(formData);
let uploadFileRes = await caseManagement.customFileUpload(formData);
// console.log(uploadFileRes)
// let fileInfo = {
// url: uploadFileRes.url,
// fileSize: uploadFileRes.size
// }
this.$emit('handleUploadFile')
}catch (e) {
this.$message.error(e.msg)
}
},
},
}
</script>
<style lang="scss">
.upload-single-file-wrap{
float: left;
.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: 80px;
}
.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

@ -55,10 +55,10 @@ export default {
{label: '调解申请书', value: 'MEDIATE_APPLICATION'},
{label: '调解询问笔录', value: 'MEDIATE_RECORD'},
{label: '调解协议', value: 'MEDIATE_AGREEMENT'},
{label: '司法申请书', value: 'JUDICATURE_APPLICATION'},
{label: '司法承诺书', value: 'JUDICATURE_PROMISE'},
// {label: '', value: 'JUDICATURE_APPLICATION'},
// {label: '', value: 'JUDICATURE_PROMISE'},
{label: '送达地址确认书', value: 'CONFIRMATION_OF_ADDRESS'},
{label: '身份识别报告', value: 'VERIFY_IDD'}
// {label: '', value: 'VERIFY_IDD'}
],
ObjectInfo: {
documentTypes: ['MEDIATE_NOTE', 'MEDIATE_APPLICATION', 'MEDIATE_RECORD', 'MEDIATE_AGREEMENT',

View File

@ -60,10 +60,10 @@ export default {
// {label: '', value: 'JUDICATURE_APPLICATION'},
// {label: '', value: 'JUDICATURE_PROMISE'},
{label: '送达地址确认书', value: 'CONFIRMATION_OF_ADDRESS'},
{label: '身份识别报告', value: 'VERIFY_IDD'}
// {label: '', value: 'VERIFY_IDD'}
],
ObjectInfo: {
documentTypes: [],
documentTypes: ['MEDIATE_NOTE','MEDIATE_APPLICATION','CONFIRMATION_OF_ADDRESS'],
},
};
},
@ -83,7 +83,12 @@ export default {
this.$emit('update:eventTraDialog', null)
},
handleSubmit() {
if (!this.ObjectInfo.documentTypes.length){ return; }
if (this.ObjectInfo.documentTypes.length == 0){
this.$message.warning("请选择文书类型!");
return
}
if(!this.$clickThrottle()) { return }//
let dataJson = {
caseIdList: this.eventTraDialog.caseids,

View File

@ -16,8 +16,8 @@
</el-col>
<el-col :span="24">
<div class="mb-24 officelist">
<el-checkbox-group v-model="ObjectInfo.methodIds">
<el-checkbox border v-for="(item,index) in officeOptions" :label="item.label" :key="index" ></el-checkbox>
<el-checkbox-group v-model="ObjectInfo.fileTypes">
<el-checkbox border v-for="(item,index) in officeOptions" :label="item.value" :key="index" >{{item.label}}</el-checkbox>
</el-checkbox-group>
</div>
@ -25,7 +25,7 @@
<el-col :span="24">
<div class="flex-row-center align-items-center height-40 mb-24">
<span class="tabs__search-criteria-title flex-shrink-0 pr-16" style="width:100px">签字有效时间</span>
<el-select v-model="ObjectInfo.methodId"
<el-select v-model="ObjectInfo.deadline"
placeholder="请选择签字有效期限" class="width100">
<el-option label="1天" value="1"></el-option>
<el-option label="2天" value="2"></el-option>
@ -64,12 +64,19 @@ import api from "@/services/caseManagement";
},
data() {
return {
officeOptions:[{label:'调解告知书',value:'1'},{label:'调解申请书',value:'2'},
{label:'送达地址确认书',value:'3'},{label:'调解笔录',value:'4'},{label:'调解协议',value:'5'}],
officeOptions:[
{label: '调解告知书', value: 'MEDIATE_NOTE'},
{label: '调解申请书', value: 'MEDIATE_APPLICATION'},
{label: '送达地址确认书', value: 'CONFIRMATION_OF_ADDRESS'},
{label: '调解询问笔录', value: 'MEDIATE_RECORD'},
{label: '调解协议', value: 'MEDIATE_AGREEMENT'},
],
ObjectInfo:{
methodIds:['调解告知书','调解申请书','送达地址确认书'],
users:'',
content:''
fileTypes:['MEDIATE_NOTE','MEDIATE_APPLICATION','CONFIRMATION_OF_ADDRESS'],
deadline:'1',
caseId:[]
},
tableData:[],
total:0,
@ -87,6 +94,31 @@ import api from "@/services/caseManagement";
this.ObjectInfo.users = jsonData.users
this.ObjectInfo.content = jsonData.content
},
handleSubmit(){
if(!this.$clickThrottle()) { return }//
if (this.ObjectInfo.fileTypes.length == 0){
this.$message.warning("请选择文书类型!");
return
}
//
let currentDate = new Date();
//
const nextDate = currentDate
currentDate.setDate(currentDate.getDate() + (this.ObjectInfo.deadline*1))
const year = nextDate.getFullYear();
const month = (nextDate.getMonth() + 1).toString().padStart(2, '0');
const day = nextDate.getDate().toString().padStart(2, '0');
this.ObjectInfo.deadline = year +'-'+ month +'-'+ day + ' 23:23:59'
this.ObjectInfo.caseId = this.eventTraDialog.caseids;
api.traceSignBatchCreate(this.ObjectInfo).then((res) => {
this.$message.success("批量发起签字成功");
this.handleClose()
this.$parent.getCaseInfoList()
});
},
// traceSignBatchCreate
handleClose() {
this.$emit('update:eventTraDialog', null)

View File

@ -567,18 +567,48 @@
<i class="f24 el-icon-document color-4E5969"></i>
<div class="pl-4 f14">协议</div>
</div>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<i class="f24 el-icon-document-remove color-4E5969"></i>
<div class="pl-4 f14">签字</div>
</div>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<i class="f24 el-icon-s-check color-4E5969"></i>
<div class="pl-4 f14">签章</div>
</div>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<i class="f24 el-icon-s-claim color-4E5969"></i>
<div class="pl-4 f14">送达</div>
</div>
<el-popover
placement="top"
width="500"
v-model="singleofficevisible"
title="发起签字"
trigger="click">
<singleofficeWritPopover :caseId="caseId" :singleofficevisible.sync="singleofficevisible"/>
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer">
<i class="f24 el-icon-document-remove color-4E5969"></i>
<a class="pl-4 f14">签字</a>
</span>
</el-popover>
<el-popover
placement="top"
width="500"
v-model="singlesealvisible"
title="发起签章"
trigger="click">
<singleofficeSealPopover :caseId="caseId" :singlesealvisible.sync="singlesealvisible"/>
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer">
<i class="f24 el-icon-s-check color-4E5969"></i>
<a class="pl-4 f14">签章</a>
</span>
</el-popover>
<el-popover
placement="top"
width="500"
v-model="singledeliveryvisible"
title="发起签章"
trigger="click">
<singleofficeDeliveryPopover :caseId="caseId" :singledeliveryvisible.sync="singledeliveryvisible"/>
<span slot="reference" class="flex-row justify-content-between align-items-center cursor-pointer">
<i class="f24 el-icon-s-claim color-4E5969"></i>
<a class="pl-4 f14">送达</a>
</span>
</el-popover>
<div class="flex-row justify-content-between align-items-center cursor-pointer">
<i class="f24 el-icon-wallet color-4E5969"></i>
<div class="pl-4 f14">类案</div>
@ -621,9 +651,16 @@ export default {
contactPerson: () => import('./contactPerson'),//
cassWrit: () => import('./cassWrit'),//
caseVideoReservationDialog: () => import('./caseVideoReservationDialog'),//
singleofficeWritPopover: () => import('./singleofficeWritPopover.vue'),//
singleofficeSealPopover: () => import('./singleofficeSealPopover.vue'),//
singleofficeDeliveryPopover: () => import('./singleofficeDeliveryPopover.vue'),//
},
data() {
return {
singledeliveryvisible:false,
singlesealvisible:false,
singleofficevisible:false,
eventDialog: {caseId: this.$route.query.caseId},
leftActive: 1,
rightActive: 1,

View File

@ -2,31 +2,82 @@
<div>
<div class="mb-16 flex-row justify-content-between">
<span class="f-weight500 f18">案件文书</span>
<!-- <span class="cursor-pointer"><i class="el-icon-tickets"></i> 文书生成</span>-->
<div class="case-office-btn">
<el-popover
placement="bottom"
width="500"
v-model="singleofficevisible"
title="发起签字"
trigger="click">
<singleofficeWritPopover :caseId="caseId" :singleofficevisible.sync="singleofficevisible"/>
<span slot="reference" class="cursor-pointer border-E5E6EB"><i class="el-icon-edit-outline"></i> 发起签字</span>
</el-popover>
<el-popover
placement="bottom"
width="500"
v-model="singlesealvisible"
title="发起签章"
trigger="click">
<singleofficeSealPopover :caseId="caseId" :singlesealvisible.sync="singlesealvisible"/>
<span slot="reference" class="cursor-pointer border-E5E6EB"><i class="el-icon-medal"></i> 文书签章</span>
</el-popover>
<!-- <span class="cursor-pointer border-E5E6EB"><i class="el-icon-medal"></i> 文书签章</span> -->
</div>
</div>
<div class="case-detail-des flex-column mb-16 border-E5E6EB" v-for="(item, index) in tableData" :key="index">
<div class="background-color-F5F5F5 p-16 flex-row align-items-center border-radius-8">
<a class="case-img"><img :src="reg_img(item.documentUrl)"/></a>
<a class="case-img"><img :src="$util.reg_img(item.documentUrl)"/></a>
<div class="flex-column pl-8">
<a class="f-weight500">{{item.fileName}}</a>
<a class="color-86909C f12 pt-6 pb-6">{{ $util.formatDate(item.signTime, 'YYYY-MM-DD HH:mm:ss')}}</a>
<div class="flex-row justify-content-between align-items-center">
<a class="f-weight500">{{item.fileName}}
<span class="case-lable">
<!-- documentStaus 0 未生成文书 1 生成中 2 完成生成 3 生成失败 -->
<!-- signStatus 0 未发起 1签字中 2签字完成 3签字失败 -->
<a class="case-status1" v-if="item.documentStaus.code == 1">生成中</a>
<a class="result-status0" v-if="item.documentStaus.code == 3">生成失败</a>
<a class="case-status2" v-if="item.documentStaus.code == 2 && item.signStatus == null">已生成</a>
<a class="case-status1" v-if="item.documentStaus.code == 2 && item.signStatus == 1">签字中</a>
<a class="case-status2" v-if="item.documentStaus.code == 2 && item.signStatus == 2">已签字</a>
<a class="result-status0" v-if="item.signStatus == 3">签字失败</a>
</span>
</a>
<!-- sealStatus 签章状态
handleBy 操作人
handleTime 操作时间 -->
<a class="color-86909C f12 pt-6 pb-6">{{item.handleBy}}&nbsp;&nbsp;{{ $util.formatDate(item.handleTime, 'YYYY-MM-DD HH:mm:ss')}}</a>
<div class="flex-row justify-content-between align-items-center color-86909C" v-if="item.signList.length > 0">
<div>签字</div>
<el-tag class="ml-4" size="small" type="success" effect="plain"
v-for="(item1, index1) in item.signList" :key="index1">{{item1.signed}}</el-tag>
v-for="(item1, index1) in item.signList" :key="index1">{{item1.signed}}</el-tag>
<el-tag class="ml-4" size="small" type="info" effect="plain"
v-for="(item2, index2) in item.unsignList" :key="index2">{{item2.unsigned}}</el-tag>
v-for="(item2, index2) in item.unsignList" :key="index2">{{item2.unsigned}}</el-tag>
</div>
</div>
</div>
<div class="color-86909C mt-8">
<a class="mr-16 ml-16 cursor-pointer"><i class="el-icon-plus"></i>模板</a>
<a class="mr-16 cursor-pointer"><i class="el-icon-document"></i>文书</a>
<a class="mr-16 cursor-pointer" @click="handleDelete(item)"><i class="el-icon-delete"></i>删除</a>
<a class="mr-16 cursor-pointer" v-if="item.documentStaus.code == 2" @click="handlePreview(item)">
<i class="el-icon-view"></i>预览</a>
<a class="mr-16 cursor-pointer" v-if="item.documentStaus.code == 2" @click="handleDownload(item)">
<i class="el-icon-download"></i>下载</a>
<upload-file v-if="item.documentStaus.code == 0 || item.documentStaus.code == 1" :max-count="1" :show-file-name="false"
uploadName="支持文件大小不超过10M"
accept=".docx,.doc"
:span="6"
:fileSize="10"
:documentType="item.type"
:caseId="caseId"
@handleUploadFile="handleUploadFile">
</upload-file>
<!-- <a class="mr-16 ml-16 cursor-pointer"><i class="el-icon-plus"></i>上传模板</a> -->
<!-- documentStaus 0 未生成文书 1 生成中 2 完成生成 3 生成失败 -->
<!-- signStatus 0 未发起 1签字中 2签字完成 3签字失败 -->
<a class="mr-16 cursor-pointer" v-if="item.documentStaus.code == 0" @click="handleFileGenerate(item)"><i class="el-icon-document"></i>生成文书</a>
<a class="mr-16 cursor-pointer" v-if="item.documentStaus.code == 1" @click="handleFileGenerate(item)"><i class="el-icon-document"></i>重新生成文书</a>
<a class="mr-16 cursor-pointer" v-if="item.documentStaus.code == 2" @click="handleDelete(item)"><i class="el-icon-delete"></i>删除</a>
<a class="mr-16 cursor-pointer" v-if="item.documentStaus.code == 2" @click="handlePreview(item)"><i class="el-icon-view"></i>预览</a>
<a class="mr-16 cursor-pointer" v-if="item.documentStaus.code == 0 || item.documentStaus.code == 1" @click="handleDownload(item)"><i class="el-icon-download"></i>下载模板</a>
<a class="mr-16 cursor-pointer" v-else @click="handleDownload(item)"><i class="el-icon-download"></i>下载文件</a>
</div>
</div>
@ -39,6 +90,9 @@ import caseManagement from "@/services/caseManagement";
export default {
components: {
pdfPreview: () => import('@/components/pdfPreview.vue'),//PDF
uploadFile: () => import('@/components/uploadSingleFile.vue'),//
singleofficeWritPopover: () => import('./singleofficeWritPopover.vue'),//
singleofficeSealPopover: () => import('./singleofficeSealPopover.vue'),//
},
name: "cassWrit",
props: {
@ -51,38 +105,25 @@ export default {
},
data() {
return{
singlesealvisible:false,
singleofficevisible:false,
tableData: [],
previewPath: '',
editPdfFlag: false
editPdfFlag: false,
officeOptions:[{label:'调解告知书',value:'1'},{label:'调解申请书',value:'2'},
{label:'送达地址确认书',value:'3'},{label:'调解笔录',value:'4'},{label:'调解协议',value:'5'}],
ObjectInfo:{
methodIds:['调解告知书','调解申请书','送达地址确认书'],
users:'',
content:''
},
}
},
async created() {
await this.getWritCaseList();
},
methods: {
reg_img(item) {
if(item==null||item=='') {
return item
}
// console.log(/.(xls|xlsx)$/.test(fileUrl.toLowerCase()),'111')
if(/.(pdf)$/.test(item.toLowerCase())) {
return require('@/assets/image/util/pdf_img.jpg')
}
else if(/.(xls|xlsx)$/.test(item.toLowerCase())) {
return require('@/assets/image/util/excel_img.jpg')
}
else if(/.(doc|docx)$/.test(item.toLowerCase())) {
return require('@/assets/image/util/word_img.jpg')
}
else if(/.(zip|rar)$/.test(item.toLowerCase())) {
return require('@/assets/image/util/yswj.jpg')
}
else {
// let previewUrl = `/mediate/minio/preview/${fileUrl}`
// return service.service.serviceurl+fileUrl
return item
}
},
//
getWritCaseList() {
let dataJson = {
@ -96,6 +137,27 @@ export default {
}
})
},
//
handleUploadFile(){
this.$message.success("上传模板成功");
this.getWritCaseList()
},
//
handleFileGenerate(item){
console.log(item,'item')
this.$confirm("请确定是否生成文件?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
if(!this.$clickThrottle()) { return }//
let data = {caseId: this.caseId,documentTypes:[item.type]}
caseManagement.traceGenerateCreate(data).then((res) => {
this.$message.success("生成文件成功");
this.getWritCaseList()
});
}).catch(() => {});
},
handleDelete(item) {
this.$confirm("请确定是否删除?", "提示", {
confirmButtonText: "确定",
@ -105,7 +167,7 @@ export default {
if(!this.$clickThrottle()) { return }//
let data = {id: item.id}
caseManagement.traceGenerateDelete(data).then((res) => {
this.$message.success("成功");
this.$message.success("文书删除成功");
this.getWritCaseList()
});
}).catch(() => {});
@ -133,6 +195,11 @@ export default {
</script>
<style scoped lang="scss">
.case-office-btn{
margin-top: 6px;
margin-right: 2px;
span{color: #BC6F60; padding: 3px 5px; border-radius: 5px;margin-right: 5px;}
}
.background-color-F5F5F5 {
background-color: #F5F5F5;
}
@ -160,4 +227,5 @@ export default {
margin-right: 4px;
}
}
</style>
</style>

View File

@ -0,0 +1,127 @@
<template>
<div class="dialog-content dialog-office-batch">
<div class="p-16">
<div class="flex-row align-items-center justify-content-between mb-16 case-batch-num">
<span>系统将对当前案件进行电子短信送达</span>
</div>
<el-collapse-transition>
<el-row :gutter="56">
<el-col :span="24">
<div class="flex-row-center align-items-center height-40 mb-8">
<span class="tabs__search-criteria-title flex-shrink-0 pr-16 f18">选择文书类型多选</span>
</div>
</el-col>
<el-col :span="24">
<div class="mb-24 officelist">
<el-checkbox-group v-model="ObjectInfo.documentTypes">
<el-checkbox border v-for="(item,index) in officeOptions" :label="item.type" :key="index" :disabled="item.documentStaus.code != 2 ? true : false">{{ item.documentType.desc }}</el-checkbox>
</el-checkbox-group>
</div>
</el-col>
</el-row>
</el-collapse-transition>
</div>
<span class="dialog-footer">
<el-button size="small" @click="handleClose()">取消</el-button>
<el-button size="small" type="primary" @click="handleSubmit()">发起送达</el-button>
</span>
</div>
</template>
<script>
import api from "@/services/caseManagement";
export default {
components: {
},
props: {
caseId: {
type: String,
default: () => {},
},
},
data() {
return {
officeOptions:[],
ObjectInfo:{
documentTypes: ['MEDIATE_NOTE', 'MEDIATE_APPLICATION', 'MEDIATE_RECORD', 'MEDIATE_AGREEMENT',
'JUDICATURE_APPLICATION', 'JUDICATURE_PROMISE' , 'CONFIRMATION_OF_ADDRESS', 'VERIFY_IDD'],
servedType: 'SMS',
caseId:''
},
};
},
mounted () {
this.getWritCaseList()
},
methods: {
//
getWritCaseList() {
let dataJson = {
id: this.caseId
}
api.getCaseGenerateList(dataJson).then(res => {
if (!res.code) {
this.officeOptions = res
}
})
},
handleSubmit(){
if(!this.$clickThrottle()) { return }//
if (this.ObjectInfo.fileTypes.length == 0){
this.$message.warning("请选择文书类型!");
return
}
this.ObjectInfo.caseId = this.caseId
api.traceServedCreate(this.ObjectInfo).then((res) => {
this.$message.success("发起签字成功");
this.handleClose()
this.$parent.getWritCaseList()
});
},
handleClose() {
this.$emit('update:singledeliveryvisible', false)
},
}
};
</script>
<style scoped lang="scss">
.dialog-office-batch {
width: 495px;
max-height: 500px;
.tabs__search-criteria-title {
width: 100%;
}
.case-batch-num {
background-color: rgba(236, 238, 241, 0.8196078431);
padding: 15px 20px;
border-radius: 4px;
a {
font-size: 16px;
font-weight: 500;
color: #C66A5B;
}
}
.officelist {
background-color: rgba(236, 238, 241, 0.8196078431);
padding: 20px 20px;
.el-checkbox {
width: 180px;
margin: 10px;
}
}
.dialog-footer{
display: inline-block;
width: 500px;
text-align: right;
border-top: solid 1px #E5E6EB;
padding: 10px;
}
}
</style>

View File

@ -0,0 +1,120 @@
<template>
<div class="dialog-content dialog-seal-batch">
<div class="p-16">
<div class="flex-row align-items-center justify-content-between mb-16 case-batch-num">
<span>系统将对当前案件中符合签字条件已经完成在线签字的调解协议文书发起电子签章</span>
</div>
<el-collapse-transition>
<el-row :gutter="56">
<el-col :span="24">
<div class="flex-row-center align-items-center height-40 mb-8">
<span class="tabs__search-criteria-title flex-shrink-0 pr-16 f18">完成签章后是否进行文书的自动送达</span>
</div>
</el-col>
<el-col :span="24">
<div class="mb-24 officelist">
<el-radio-group v-model="ObjectInfo.autoServed">
<el-radio :label="1" border>自动送达</el-radio>
<el-radio :label="0" border>不自动送达(后续可单独发起送达)</el-radio>
</el-radio-group>
</div>
<!-- :disabled="item.documentStaus.code != 2 ? true : false" -->
</el-col>
</el-row>
</el-collapse-transition>
</div>
<span class="dialog-footer">
<el-button size="small" @click="handleClose()">取消</el-button>
<el-button size="small" type="primary" @click="handleSubmit()">发起签章</el-button>
</span>
</div>
</template>
<script>
import api from "@/services/caseManagement";
export default {
components: {
},
props: {
eventTraDialog: {
type: Object,
default: () => {
return {}
},
},
caseId: {
type: String,
default: () => {},
},
},
data() {
return {
officeOptions:[],
ObjectInfo:{
ids:[],
autoServed:0
},
tableData:[]
};
},
mounted () {
},
methods: {
handleSubmit(){
if(!this.$clickThrottle()) { return }//
this.ObjectInfo.ids.push(this.caseId)
api.traceSeal_launch(this.ObjectInfo).then((res) => {
this.$message.success("发起签章成功");
this.handleClose()
this.$parent.getWritCaseList()
});
},
handleClose() {
this.$emit('update:singlesealvisible', false)
},
}
};
</script>
<style scoped lang="scss">
.dialog-seal-batch {
width: 495px;
max-height: 330px;
.tabs__search-criteria-title {
width: 100%;
}
.case-batch-num {
background-color: rgba(236, 238, 241, 0.8196078431);
padding: 15px 20px;
border-radius: 4px;
a {
font-size: 16px;
font-weight: 500;
color: #C66A5B;
}
}
.officelist {
background-color: rgba(236, 238, 241, 0.8196078431);
padding: 20px 20px;
.el-checkbox {
width: 180px;
margin: 10px;
}
}
.dialog-footer{
display: inline-block;
width: 500px;
text-align: right;
border-top: solid 1px #E5E6EB;
padding: 10px;
}
}
</style>

View File

@ -0,0 +1,158 @@
<template>
<div class="dialog-content dialog-office-batch">
<div class="p-16">
<div class="flex-row align-items-center justify-content-between mb-16 case-batch-num">
<span>系统将对当前案件中符合签字条件已经完成文书生成的文书发起电子签字</span>
</div>
<el-collapse-transition>
<el-row :gutter="56">
<el-col :span="24">
<div class="flex-row-center align-items-center height-40 mb-8">
<span class="tabs__search-criteria-title flex-shrink-0 pr-16 f18">选择文书类型多选</span>
</div>
</el-col>
<el-col :span="24">
<div class="mb-24 officelist">
<el-checkbox-group v-model="ObjectInfo.fileTypes">
<el-checkbox border v-for="(item,index) in officeOptions" :label="item.type" :key="index" :disabled="item.documentStaus.code != 2 ? true : false">{{ item.documentType.desc }}</el-checkbox>
</el-checkbox-group>
</div>
<!-- :disabled="item.documentStaus.code != 2 ? true : false" -->
</el-col>
<el-col :span="24">
<div class="flex-row-center align-items-center height-40">
<span class="tabs__search-criteria-title flex-shrink-0 pr-16" style="width:100px">签字有效时间</span>
<el-select v-model="ObjectInfo.deadline" size="small"
placeholder="请选择签字有效期限" class="width100">
<el-option label="1天" value="1"></el-option>
<el-option label="2天" value="2"></el-option>
<el-option label="3天" value="3"></el-option>
<el-option label="4天" value="4"></el-option>
<el-option label="5天" value="5"></el-option>
</el-select>
</div>
</el-col>
</el-row>
</el-collapse-transition>
</div>
<span class="dialog-footer">
<el-button size="small" @click="handleClose()">取消</el-button>
<el-button size="small" type="primary" @click="handleSubmit()">发起签字</el-button>
</span>
</div>
</template>
<script>
import api from "@/services/caseManagement";
export default {
components: {
},
props: {
eventTraDialog: {
type: Object,
default: () => {
return {}
},
},
caseId: {
type: String,
default: () => {},
},
},
data() {
return {
officeOptions:[],
ObjectInfo:{
fileTypes:[],
caseId:'',
deadline:'1'
},
tableData:[]
};
},
mounted () {
this.getWritCaseList()
},
methods: {
//
getWritCaseList() {
let dataJson = {
id: this.caseId
}
api.getCaseGenerateList(dataJson).then(res => {
if (!res.code) {
this.officeOptions = res
}
})
},
handleSubmit(){
if(!this.$clickThrottle()) { return }//
if (this.ObjectInfo.fileTypes.length == 0){
this.$message.warning("请选择文书类型!");
return
}
//
let currentDate = new Date();
//
const nextDate = currentDate
currentDate.setDate(currentDate.getDate() + (this.ObjectInfo.deadline*1))
const year = nextDate.getFullYear();
const month = (nextDate.getMonth() + 1).toString().padStart(2, '0');
const day = nextDate.getDate().toString().padStart(2, '0');
this.ObjectInfo.deadline = year +'-'+ month +'-'+ day + ' 23:23:59'
this.ObjectInfo.caseId = this.caseId
api.traceSignCreate(this.ObjectInfo).then((res) => {
this.$message.success("发起签字成功");
this.handleClose()
this.$parent.getWritCaseList()
});
},
handleClose() {
this.$emit('update:singleofficevisible', false)
},
}
};
</script>
<style scoped lang="scss">
.dialog-office-batch {
width: 495px;
max-height: 500px;
.tabs__search-criteria-title {
width: 100%;
}
.case-batch-num {
background-color: rgba(236, 238, 241, 0.8196078431);
padding: 15px 20px;
border-radius: 4px;
a {
font-size: 16px;
font-weight: 500;
color: #C66A5B;
}
}
.officelist {
background-color: rgba(236, 238, 241, 0.8196078431);
padding: 20px 20px;
.el-checkbox {
width: 180px;
margin: 10px;
}
}
.dialog-footer{
display: inline-block;
width: 500px;
text-align: right;
border-top: solid 1px #E5E6EB;
padding: 10px;
}
}
</style>

View File

@ -209,7 +209,10 @@ const caseManagementApi = {
},
// 案件文书-上传模板
customFileUpload: data => {
return service.service.post(`${apiAdmin}api/trace/traceGenerate/customFile/upload`, data)
return service.service.post(`${apiAdmin}api/trace/traceGenerate/customFile/upload`, data, {
headers:
{'Content-Type': 'multipart/form-data'},
},)
},
// 案件文书-生成文书
traceGenerateCreate: data => {
@ -232,6 +235,18 @@ const caseManagementApi = {
return service.service.post(`${apiAdmin}api/trace/traceGenerate/batch-retry`, data)
},
//
// 案件签字-发起签字
traceSignCreate: data => {
return service.service.post(`${apiAdmin}api/trace/traceSign/create`, data)
},
// 案件签字-批量发起签字
traceSignBatchCreate: data => {
return service.service.post(`${apiAdmin}api/trace/traceSign/batch-create`, data)
},
//========================end::案件管理======================================
}
export default caseManagementApi;

View File

@ -171,9 +171,9 @@ const util = {
reg_img(fileUrl) {
console.log(fileUrl,'---fileUrl')
if(fileUrl==null||fileUrl=='') {
return fileUrl
// return fileUrl
return require('../assets/image/util/word_img.jpg')
}
console.log(/.(pdf)$/.test(fileUrl.toLowerCase()),'111')
if(/.(pdf)$/.test(fileUrl.toLowerCase())) {
return require('../assets/image/util/pdf_img.jpg')
}