Files
faw-report-library-web/src/views/reportProcess/components/reportForm.vue
T

757 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<el-form ref="processFormRef" :model="form" label-width="150px"
:rules="processFormRule" class="label-input-form" size="medium">
<el-row>
<el-col :span="10" :offset="1">
<el-form-item label="报告名称:" prop="name">
<el-input :disabled="formControl" v-model="form.name"
placeholder="请输入报告名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="10" :offset="2">
<el-form-item label="报告年份:" prop="year">
<el-date-picker :disabled="formControl" v-model="form.year" type="year" value-format="yyyy"
placeholder="请选择报告年份"
prefix-icon="null" :picker-options="pickerOptions"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10" :offset="1">
<el-form-item label="报告所属部门:" prop="department">
<el-input readonly :disabled="formControl" v-model="form.departmentName" @click.native="handleClick"
placeholder="请选择报告所属部门"
></el-input>
</el-form-item>
</el-col>
<el-col :span="10" :offset="2">
<el-form-item label="标签:">
<el-cascader :disabled="formControl" v-model="form.labelList" :options="cascaderOptions"
filterable collapse-tags
:props="{ checkStrictly: true ,multiple: true }" clearable placeholder="请选择标签">
<template slot-scope="{ node, data }">
<span :title="data.label">{{ data.label }}</span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10" :offset="1">
<el-form-item label="报告涉密等级:" prop="confidentialLevel">
<el-select :disabled="formControl" v-model="form.confidentialLevel" placeholder="请选择报告涉密等级"
@change="reportLevel">
<el-option v-for="item in privacyLevelOptions " :key="item.value" :label="item.value"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="10" :offset="2" v-if="isShowTime">
<el-form-item label="保密到期日期:" prop="secrecyLast">
<el-date-picker :disabled="formControl" v-model="form.secrecyLast" type="date"
placeholder="请选择保密到期日期" @change="changeDate"
prefix-icon="null"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10" :offset="1">
<el-form-item label="报告隐私等级:" prop="privacyLevel">
<el-select :disabled="formControl" v-model="form.privacyLevel" placeholder="请选择报告隐私等级">
<el-option v-for="item in confidentialLevelOptions" :key="item.value" :label="item.value"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="10" :offset="2">
<el-form-item label="关键词:" prop="tags">
<vue-tags-input :disabled="formControl" :class="{'is-diable':formControl}" placeholder="采用回车进行关键词分割"
v-model="form.tags" :tags="tags"
@before-deleting-tag="delTag"
@before-adding-tag="addTags"
:avoid-adding-duplicates="false" @tags-changed="newTags => tags=newTags"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="22" :offset="1">
<el-form-item label="内容摘要:" prop="mainContent">
<el-input :disabled="formControl" v-model="form.mainContent" placeholder="请填写内容摘要" type="textarea"
maxlength="500"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="5" :offset="1">
<el-form-item label="上传报告:" prop="fileList">
<el-button class="uploadBtn" @click="dialogFile=true">
{{fileList.length>0?('上传文件(已上传'+fileList.length+'个文件)'):'上传文件'}}
</el-button>
</el-form-item>
</el-col>
<el-col :span="8" >
<span class="uploadFile" v-if="form.fileName">
<!-- <span :class="{'fontColor':formControl}" :title="form.fileName" class="juli">{{ form.fileName }}</span>-->
<!-- <svg-icon icon-class="cloud" @click="downFile(form.fileId)" style="font-size: 20px"-->
<!-- class-name="icon" ></svg-icon>-->
<!-- <svg-icon icon-class="del" @click="delFile" style="font-size: 20px"-->
<!-- v-if="!formControl" class-name="icon" ></svg-icon>-->
<!-- <i class="el-icon-cloudy iconstyle" ></i>-->
<!-- <i :class="{'fontColor':formControl}" class="el-icon-delete iconstyle" @click="delFile"></i>-->
</span>
</el-col>
</el-row>
</el-form>
<orgTable :visible.sync="visibleOrgTable" title="人员列表" dialog-model :config="{
value: orgTableVal,
valueName: orgTableValName
}" :workNumFlag="true" :isOrg="true" :maxSelected="1" @confirm="isTreeOk"></orgTable>
<el-dialog title="上传文件" :visible.sync="dialogFile" width="40%" :close-on-click-modal="false"
:close-on-press-escape="false" modal-append-to-body append-to-body>
<el-upload :disabled="formControl" action="/library/api/report/uploadFile" :show-file-list="false"
:before-upload="beforeUploadFile" accept=".xls,.xlsx,.XLS,.XLSX,.pdf,.PDF,.ppt,.PPT,pptx,.PPTX,.doc,.docx,DOC,.DOCX"
:file-list="fileList" multiple :on-success="onSuccess"
:on-preview="handlePreview"
:class="{'disable':formControl}">
<div class="table_top">
<el-button class="uploadBtn" type="primary" >上传文件</el-button>
</div>
</el-upload>
<div class="table">
<vxe-table ref="xTable" :data="fileLists" :empty-render="{name: 'NotData'}" align="center" border stripe
class="table-over" width="100%" :loading="table_loading"
v-table-min-height="'50px'">
<vxe-column show-header-overflow field="name" title="文件名称">
<template #default="{ row, rowIndex }">
<!-- <label class="row-title" >-->
<!-- <el-tooltip :content="row.name" placement="top-start">-->
<span class="report-name"> {{ row.name }}</span>
</template>
</vxe-column>
<vxe-column show-overflow show-header-overflow title="操作" width="200" fixed="right">
<template #default="{ row }">
<el-button type="text" class="del-btn" v-if="!formControl" @click="handleRemove(row)">删除</el-button>
</template>
</vxe-column>
</vxe-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="q.pageNo"
:page-sizes="[5, 10, 20]"
:page-size="q.pageSize"
layout="total, sizes, prev, pager, next"
:total="total"/>
</div>
</el-dialog>
</div>
</template>
<script>
import {fileType} from '@/utils/fileType'
import newTranslate from "../../../components/newTranslate";
import VueTagsInput from '@johmun/vue-tags-input';
import orgTable from '@/components/OrgTable'
import {privacyLevelOptions, confidentialLevelOptions} from '@/utils/Enum/enum'
import {downloadFile} from '@/utils/downloadFile'
export default {
components: {
VueTagsInput,
newTranslate,
orgTable
},
props: {
prcType:{
type: String
},
formControl: {
type: Boolean,
default: false
},
formControlname: {
type: Boolean,
default: false
},
processForm: {
type: Object
}
},
data() {
return {
table_loading:false,
total:0,
fileLists:[],
delIds:[],
dialogFile:false,
privacyLevelOptions,
confidentialLevelOptions,
orgTableVal: '',
orgTableValName: '',
visibleOrgTable: false,
isShowTime: false, //是否显示日期
loadingMore: false,
listTwo: [], //存储下载预览的
allUser: [], //存储全部的
listOne: [1],
dialogUser: false,
cascaderOptions: [],
tags: [],
pickerOptions: {
disabledDate(time) {
return time.getFullYear() > new Date().getFullYear() + 1 || time.getFullYear() < new Date().getFullYear() - 10;
},
},
form: {},
processFormRule: {
fileList: [
{
required: true,
message: "上传报告不能为空",
trigger: 'change'
}
],
prcName: [
{
required: true,
message: "流程名称不能为空",
trigger: 'change'
}, {
max: 100,
message: "流程名称不能超过100字符",
trigger: 'change'
}
],
name: [{
required: true,
message: "报告名称不能为空",
trigger: 'change'
}, {
max: 100,
message: "报告名称不能超过100字符",
trigger: 'change'
}],
mainContent: [{
max: 500,
message: "内容摘要不能超过500字符",
trigger: 'change'
}],
year: [{
required: true,
message: "报告年份不能为空",
trigger: 'change'
}],
reportUserIdList: [
{
required: true,
message: "权限不能为空",
trigger: 'change'
}
],
fileName: [
{
required: true,
message: "报告文件不能为空", trigger: 'change'
}
],
privacyLevel: [
{
required: true,
message: "报告隐私等级不能为空", trigger: 'change'
}
],
confidentialLevel: [
{
required: true,
message: "报告涉密等级不能为空", trigger: 'change'
}
],
secrecyLast: [
{
required: true,
message: "保密到期日期不能为空", trigger: 'change'
}
]
},
q: {
pageNo: 1,
pageSize: 10
},
fileList: []
}
},
watch: {
processForm: {
handler(val) {
console.log(this.formControl,"jajjajajajajj")
this.form = this.processForm
console.log("变化了", this.form)
if (this.form.secrecyLast) {
this.isShowTime = true
this.form.secrecyLast = new Date(this.form.secrecyLast)
}
if (this.processForm.keyContent) {
this.tags = JSON.parse(this.processForm.keyContent)
}
if (this.processForm.labelList && typeof this.processForm.labelList[0] == 'string') {
this.form.labelList = this.processForm.labelList.map(item => {
return JSON.parse(item)
})
}
if (this.$route.query.isDraft) {
this.$nextTick(()=>{
this.$refs.processFormRef.clearValidate()
})
}
console.log(this.processForm,"this.processForm.fileList.length")
if(this.processForm.fileList){
if(this.processForm.fileList.length>0){
this.fileList=this.processForm.fileList.map(item=>{
return {
name:item.fileName,
id:item.fileId
}
})
this.handleCurrentChange(1)
}
}
},
immediate: true
}
},
methods: {
handleSizeChange(size){
this.q.pageSize=size
this.q.pageNo=1
this.handleCurrentChange()
},
handleCurrentChange(current){
setTimeout(() => {
current = current ? current : this.q.pageNo
this.q.pageNo = current
this.fileLists = this.fileList.slice(this.q.pageSize * (current - 1), this.q.pageSize * current)
// console.log(this.pages.size, this.pages.size * (current - 1), this.pages.size * this.pages.current, this.list)
if (this.fileLists.length < 1 && current > 1) {
this.handleCurrentChange(current - 1)
return false
}
this.total = this.fileList.length
this.table_loading=false
},500)
},
handlePreview(file){
let lastName=file.name.split('.')
let list=['xls','xlsx']
if(list.indexOf(lastName[lastName.length-1].toLower)==-1){
if(this.form.id|| this.form.reportId ) {
this.$api.report.reportDownload({reportId: this.form.id || this.form.reportId, fileId: file.id}).then(res => {
downloadFile(res)
})
}
}else{
this.$message.warning("当前.xls,.xlsx文件不支持下载")
}
},
changeDate(d){
this.form.secrecyLast = new Date(d)
},
delTag(obj) {
console.log("我我我")
obj.deleteTag()
},
addTags(obj) {
if (obj.tag.text.length <= 20) {
if (this.tags.length < 10) {
obj.addTag();
} else {
this.$message({type: 'error', message: '关键词数量不能超过10个'})
}
} else {
this.$message({type: 'error', message: '单个关键词不能超过20个字'})
}
},
downFile(id) {
this.$api.report.reportDownload({reportId: null, fileId: id}).then(res => {
downloadFile(res)
})
},
handleClick() {
if (this.formControl) return
if (this.form.departmentName) {
this.orgTableVal = this.form.department
this.orgTableValName = this.form.departmentName
}
this.visibleOrgTable = true
},
isTreeOk(checkedList) {
const parts = []
const partsName = []
checkedList.map((item, index) => {
parts.push(item.id)
partsName.push(item.longName)
})
this.qcrList = checkedList
this.form.department = parts.toString()
this.form.departmentName = partsName.toString()
},
reportLevel(item) {
let imList = ['普通商密', '核心商密']
if (imList.indexOf(this.form.confidentialLevel) > -1) {
let currentDate = new Date()
let futureDate
if (item == '普通商密')
futureDate = new Date(currentDate.getFullYear() + 5, currentDate.getMonth(), currentDate.getDate());
else
futureDate = new Date(currentDate.getFullYear() + 10, currentDate.getMonth(), currentDate.getDate());
this.isShowTime = true
this.form.secrecyLast = futureDate
} else {
this.isShowTime = false
this.form.secrecyLast = ''
}
},
loadMore() {
this.q.pageNo++
this.getAllPerson()
},
closeD() {
if (this.$route.query.isBegin || this.$route.query.isDraft) {
this.listOne = []
this.listTwo = []
} else {
}
this.dialogUser = false
},
saveCheck() {
// 可以编辑
if (!this.formControl) {
// 第一次发起与草稿还要区分
if (this.$route.query.isBegin || this.$route.query.isDraft) {
let list1 = this.listOne.map(item => {
let obj = {
userId: item,
power: 1
}
return obj
})
let list2 = this.listTwo.map(item => {
let obj = {
userId: item,
power: 2
}
return obj
})
this.form.powerList = [...list1, ...list2]
this.dialogUser = false
} else {
//如果是发起人编辑节点
let list1 = this.listOne.map(item => {
let obj = {
userId: item.id,
power: 1
}
return obj
})
let list2 = this.listTwo.map(item => {
let obj = {
userId: item.id,
power: 2
}
return obj
})
this.form.powerList = [...list1, ...list2]
}
} else {
}
},
//获取全部人员
getAllPerson() {
this.$api.user.sysUserList(this.q).then(({data}) => {
let newlist = data.records.map(item => {
let obj = {
key: item.USID,
value: item.USID,
label: item.USID
}
return obj
})
this.allUser = [...this.allUser, ...newlist]
this.total = data.total
this.q.pageNo = data.current
this.q.pageSize = data.size
if (!data.records.length && this.q.pageNo !== 1) {
this.q.pageNo = 1
this.sysUserList()
}
this.loadingMore = false
})
},
handleChange(value, direction, movedKeys) {
console.log(value, direction, movedKeys);
},
openDialog() {
this.dialogUser = true
},
handleRemove(file, fileList) {
debugger
this.fileList = this.fileList.filter(item=>{
let id=file.response?file.response.data.id:file.id
let ietmid=item.response?item.response.data.id:item.id
if(ietmid!=id){
return item
}
})
this.form.fileList = this.fileList.map(item=>{
return {
fileId:item.response?item.response.data.id:item.id,
fileName:item.response?item.response.data.name:item.name
}
})
this.handleCurrentChange(1)
},
//用递归方式去除children
getTreeData(data) {
for (var i = 0; i < data.length; i++) {
if (data[i].children.length < 1) {
// children若为空数组,则将children设为undefined
data[i].children = undefined;
} else {
// children若不为空数组,则继续 递归调用 本方法
this.getTreeData(data[i].children);
}
}
return data;
},
updateList() {
this.$api.report.labelList().then(res => {
this.cascaderOptions = this.getTreeData(res.data)
})
this.$forceUpdate()
},
onSuccess(res, file,fileList){
if(res.ok){
// this.fileList.push({url:res.data.fullurl})//以前的错误代码
this.fileList=fileList
this.form.fileList = this.fileList.map(item=>{
return {
fileId:item.response?item.response.data.id:item.id,
fileName:item.response?item.response.data.name:item.name
}
})
this.$refs.processFormRef.clearValidate(['fileList'])
if( this.form.fileList[fileList.length-1].fileId ){
this.handleCurrentChange(1)
console.log( this.form.fileList,"444")
}
}
console.log( res," this.fileList3")
},
// 上传文件
uploadFile(params) {
let fd = new FormData();
fd.append('file', params.file);
this.$api.report.reportUploadFile(fd).then(({data}) => {
console.log( this.fileList," this.fileList")
this.fileList.push(data)
this.form.fileList = this.fileList.map(item=>{
return {
fileId:item.id,
fileName:item.name
}
})
this.$refs.processFormRef.clearValidate(['fileList'])
})
console.log( this.fileList," this.fileList22222")
},
// 上传文件前
beforeUploadFile(file) {
let realFileType = file.name.split('.')[file.name.split('.').length - 1];
const isType = (
file.type === fileType.pdf || file.type === fileType.ppt || file.type === fileType.pptx || file.type === fileType.xlsx||
file.type == fileType.xls
|| realFileType === 'pdf' || realFileType === 'ppt' || realFileType === 'pptx' || realFileType == 'xls' || realFileType== 'xlsx'
);
const isSize = file.size / 1024 / 1024 < 200;
if (!isType) {
setTimeout(()=>{
this.$message.error('仅能上传 pdfpptpptx | excel 格式文件');
})
}
if (!isSize) {
setTimeout(()=> {
this.$message.error('您最大可上传200M文件');
})
}
if(isType && isSize){
this.table_loading=true
}
return isType && isSize;
},
submit() {
let flag
this.$refs.processFormRef.validate(v => {
flag = v
return v
})
return flag
}
},
mounted() {
this.updateList()
// this.getAllPerson()
}
}
</script>
<style lang="scss" scoped>
::v-deep .ti-input {
border-radius: 4px;
border: 1px solid #DCDFE6;
min-height: 40px;
line-height: 40px;
.ti-new-tag-input {
padding-left: 5px;
}
.ti-new-tag-input::placeholder {
color: #C0C4CC;
font-size: 14px;
}
.ti-new-tag-input:-ms-input-placeholder {
color: #C0C4CC;
font-size: 14px;
}
.ti-new-tag-input:-moz-placeholder {
color: #C0C4CC;
font-size: 14px;
}
}
::v-deep .vue-tags-input :focus {
border: 1px solid #1890ff;
}
.user-form {
padding-top: 26px;
.done {
text-align: center;
padding: 40px 0;
::v-deep .el-button {
width: 80px;
height: 36px;
padding: 0;
}
}
}
.uploadFile {
margin-left: -35px;
height: 36px;
line-height: 36px;
display: inline-block;
.juli {
display: inline-block;
color: #555;
width: 200px;
font-size: 15px;
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
height: 33px;
white-space: pre;
}
svg {
margin-left: 5px;
cursor: pointer;
}
.svg-icon {
vertical-align: super;
}
.fontColor {
color: #858585 !important;
}
}
::v-deep .el-cascader__tags .el-tag{
max-width: 70%;
}
::v-deep .el-input.is-disabled .el-input__inner{
color: #858585;
}
::v-deep .el-textarea.is-disabled .el-textarea__inner{
color: #858585;
resize: none;
}
::v-deep .el-input.is-disabled .el-input__inner{
color: #858585;
}
::v-deep .el-dialog{
min-width: 380px !important;
padding: 0 10px;
.el-dialog__body{
//text-align: center;
}
}
.disable{
::v-deep .el-upload-dragger{
cursor: not-allowed ;
}
}
.table_top{
padding: 10px 13px;
text-align: left;
}
.table {
padding-bottom: 15px;
min-height: 200px;
::v-deep .vxe-table--body-wrapper{
height: 200px;
overflow: auto;
}
.uploadBtn{
margin: 10px;
}
::v-deep .el-pagination{
padding-top: 10px;
}
}
</style>