You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
590 lines
16 KiB
590 lines
16 KiB
<template> |
|
<el-row> |
|
<!-- <el-col :span="4"> |
|
<div class="box"> |
|
<el-scrollbar> |
|
<basic-container> |
|
<avue-tree :option="treeOption" :data="treeData" @node-click="nodeClick" /> |
|
</basic-container> |
|
</el-scrollbar> |
|
</div> |
|
</el-col> --> |
|
<el-col :span="24"> |
|
<basic-container> |
|
<avue-crud :option="option" :search.sync="search" :table-loading="loading" :data="data" ref="crud" |
|
v-model="form" :permission="permissionList" @row-del="rowDel" @row-update="rowUpdate" |
|
@row-save="rowSave" :before-open="beforeOpen" :page.sync="page" @search-change="searchChange" |
|
@search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange" |
|
@size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad"> |
|
<template slot-scope="scope" slot="menuLeft"> |
|
<el-button v-show="permission.contentAdd" type="primary" size="small" |
|
@click="handleAdd">新建</el-button> |
|
</template> |
|
<template slot-scope="{ row }" slot="isOpen"> |
|
<el-tag :type="row.isOpen == 0 ? 'danger' : 'success'">{{ row.isOpen == 0 ? '停用' : '启用' |
|
}}</el-tag> |
|
</template> |
|
<template slot-scope="{ row }" slot="menu"> |
|
<el-button v-show="permission.contentView" @click="handleView(row)">查看</el-button> |
|
<el-button v-show="permission.contentEdit" @click="handleEdit(row)">编辑</el-button> |
|
<el-button @click="startPlan(row)" |
|
v-show="row.isOpen == 0 && permission.contentSetting">启用</el-button> |
|
<el-button @click="stopPlan(row)" |
|
v-show="row.isOpen == 1 && permission.contentSetting">停用</el-button> |
|
<el-button @click="deletePlan(row)" v-show="permission.contentDelete">删除</el-button> |
|
<el-button @click="handleDownload(row)" |
|
v-show="permission.contentDelete">下载</el-button> |
|
<el-button type="primary" @click="handleExportDevice(row)">导出</el-button> |
|
<!-- <el-button @click="handleImport(row)">导入</el-button> --> |
|
</template> |
|
</avue-crud> |
|
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" :append-to-body="true" width="70%"> |
|
<addDialog :unitData="unitData" :title="dialogTitle" :detailForm="detailForm" ref="addDialog"> |
|
</addDialog> |
|
<span slot="footer" class="dialog-footer"> |
|
<el-button @click="handleCancel">取 消</el-button> |
|
<el-button v-show="dialogTitle != '查看'" type="primary" @click="handleConfirm">提 交</el-button> |
|
</span> |
|
</el-dialog> |
|
</basic-container> |
|
</el-col> |
|
</el-row> |
|
</template> |
|
|
|
<script> |
|
import addDialog from './components/addDialog.vue' |
|
import { mapGetters } from "vuex"; |
|
import JSZip from 'jszip'; |
|
import { saveAs } from 'file-saver'; |
|
import { getLimsTree, planCreate, getContentList, getPlanDetail, dealPlan, deletePlan, editPlan } from '@/api/labManagement/inspectionManagement' |
|
import { exportBlob1 } from "@/api/common"; |
|
import { downloadXls } from "@/util/util"; |
|
export default { |
|
components: { |
|
addDialog |
|
}, |
|
data() { |
|
const validatePass = (rule, value, callback) => { |
|
if (value === '') { |
|
callback(new Error('请输入密码')); |
|
} else { |
|
callback(); |
|
} |
|
}; |
|
const validatePass2 = (rule, value, callback) => { |
|
if (value === '') { |
|
callback(new Error('请再次输入密码')); |
|
} else if (value !== this.form.password) { |
|
callback(new Error('两次输入密码不一致!')); |
|
} else { |
|
callback(); |
|
} |
|
}; |
|
return { |
|
dialogTitle: '', |
|
form: {}, |
|
search: {}, |
|
roleBox: false, |
|
excelBox: false, |
|
platformBox: false, |
|
initFlag: true, |
|
selectionList: [], |
|
query: {}, |
|
loading: true, |
|
platformLoading: false, |
|
page: { |
|
pageSize: 10, |
|
currentPage: 1, |
|
total: 0 |
|
}, |
|
platformPage: { |
|
pageSize: 10, |
|
currentPage: 1, |
|
total: 0 |
|
}, |
|
init: { |
|
roleTree: [], |
|
deptTree: [], |
|
}, |
|
props: { |
|
label: "title", |
|
value: "key" |
|
}, |
|
roleGrantList: [], |
|
roleTreeObj: [], |
|
treeDeptId: '', |
|
treeData: [ |
|
// { |
|
// hasChildren: true, |
|
// id: "1123598813738675201", |
|
// key: "1123598813738675201", |
|
// parentId: "0", |
|
// title: "山东区", |
|
// children: [ |
|
// { |
|
// hasChildren: true, |
|
// id: "1123598813738675202", |
|
// key: "1123598813738675202", |
|
// parentId: "1123598813738675202", |
|
// title: "安池实验室", |
|
// value: "1123598813738675202", |
|
// children: [ |
|
// { |
|
// hasChildren: false, |
|
// id: "1123598813738675204", |
|
// key: "1123598813738675204", |
|
// parentId: "1123598813738675204", |
|
// title: "三楼", |
|
// value: "1123598813738675204", |
|
// }, |
|
// { |
|
// hasChildren: false, |
|
// id: "1123598813738675205", |
|
// key: "1123598813738675205", |
|
// parentId: "1123598813738675205", |
|
// title: "四楼", |
|
// value: "1123598813738675205", |
|
// } |
|
// ] |
|
// }, |
|
// { |
|
// hasChildren: true, |
|
// id: "1123598813738675203", |
|
// key: "1123598813738675203", |
|
// parentId: "1123598813738675203", |
|
// title: "畜牧局实验室", |
|
// value: "1123598813738675203", |
|
// } |
|
// ] |
|
// } |
|
], |
|
unitData: [], |
|
treeOption: { |
|
nodeKey: 'id', |
|
// lazy: true, |
|
// treeLoad: function (node, resolve) { |
|
// const parentId = (node.level === 0) ? 0 : node.data.id; |
|
// getDeptLazyTree(parentId).then(res => { |
|
// resolve(res.data.data.map(item => { |
|
// return { |
|
// ...item, |
|
// leaf: !item.hasChildren |
|
// } |
|
// })) |
|
// }); |
|
// }, |
|
addBtn: false, |
|
menu: false, |
|
size: 'small', |
|
props: { |
|
labelText: '标题', |
|
label: 'title', |
|
value: 'value', |
|
children: 'children' |
|
} |
|
}, |
|
option: { |
|
height: 'auto', |
|
calcHeight: 80, |
|
tip: false, |
|
searchShow: true, |
|
searchMenuSpan: 6, |
|
border: true, |
|
index: true, |
|
selection: true, |
|
addBtn: false, |
|
viewBtn: false, |
|
editBtn: false, |
|
delBtn: false, |
|
dialogType: 'dialog', |
|
dialogClickModal: false, |
|
searchShowBtn: false, |
|
refreshBtn: false, |
|
columnBtn: false, |
|
menuWidth: 300, |
|
column: [ |
|
{ |
|
label: "单位名称", |
|
labelWidth: 120, |
|
prop: "deptName", |
|
search: true, |
|
overHidden: true, |
|
}, |
|
{ |
|
label: "巡检内容", |
|
labelWidth: 120, |
|
prop: "planContent", |
|
overHidden: true, |
|
}, |
|
{ |
|
label: "是否启用", |
|
labelWidth: 120, |
|
prop: "isOpen", |
|
overHidden: true, |
|
slot: true |
|
}, |
|
{ |
|
label: "创建时间", |
|
labelWidth: 120, |
|
prop: "createTime", |
|
overHidden: true, |
|
}, |
|
// { |
|
// label: "包含专业/设备", |
|
// labelWidth: 120, |
|
// prop: "major", |
|
// labelWidth: 120, |
|
// overHidden: true, |
|
// }, |
|
// { |
|
// label: "备注", |
|
// labelWidth: 120, |
|
// overHidden: true, |
|
// prop: "remark", |
|
// }, |
|
], |
|
}, |
|
data: [], |
|
dialogVisible: false, |
|
addForm: {}, |
|
detailForm: {} |
|
}; |
|
}, |
|
computed: { |
|
...mapGetters(["userInfo", "permission"]), |
|
}, |
|
mounted() { |
|
this.tableData = this.mergeTableRow(this.tableData, ['majorName']) |
|
console.log('userInfo--------------->', this.userInfo) |
|
this.getLeftLab() |
|
// if(this.userInfo.role_id == '1846419477876510721'){ |
|
// this.search.deptName = this.userInfo.deptName |
|
// } |
|
}, |
|
methods: { |
|
handleExportDevice(row) { |
|
let query = JSON.parse(JSON.stringify(row)) |
|
exportBlob1(`/api/lab-ops/maintenance/maintenance-plan-report`, query).then(res => { |
|
downloadXls(res.data, "巡检计划.xlsx"); |
|
}) |
|
}, |
|
objectSpanMethod({ row, column, rowIndex, columnIndex }) { |
|
// console.log('row--------------->',row) |
|
// console.log('column--------------->',column) |
|
// console.log('rowIndex--------------->',rowIndex) |
|
// console.log('columnIndex--------------->',columnIndex) |
|
const span = column['property'] + '-span' |
|
if (row[span]) { |
|
return row[span] |
|
} |
|
|
|
}, |
|
// 启用计划 |
|
startPlan(row) { |
|
this.$confirm('确定启用该计划?', '提示', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning' |
|
}).then(() => { |
|
dealPlan({ id: row.id, isOpen: 1 }).then(res => { |
|
if (res.data.code == 200) { |
|
this.$message.success('启用成功') |
|
this.onLoad() |
|
} |
|
}) |
|
}) |
|
}, |
|
// 停用计划 |
|
stopPlan(row) { |
|
this.$confirm('确定停用该计划?', '提示', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning' |
|
}).then(() => { |
|
dealPlan({ id: row.id, isOpen: 0 }).then(res => { |
|
if (res.data.code == 200) { |
|
this.$message.success('停用成功') |
|
this.onLoad() |
|
} |
|
}) |
|
}) |
|
}, |
|
deletePlan(row) { |
|
this.$confirm('确定删除该计划?', '提示', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning' |
|
}).then(() => { |
|
deletePlan({ ids: row.id }).then(res => { |
|
if (res.data.code == 200) { |
|
this.$message.success('删除成功') |
|
this.onLoad() |
|
} |
|
}) |
|
}) |
|
}, |
|
getFile(url) { |
|
return new Promise((resolve, reject) => { |
|
//通过请求获取文件blob格式 |
|
let xmlhttp = new XMLHttpRequest(); |
|
xmlhttp.open("GET", url, true); |
|
xmlhttp.responseType = "blob"; |
|
xmlhttp.onload = function () { |
|
if (xmlhttp.status == 200) { |
|
resolve(xmlhttp.response); |
|
} else { |
|
reject(xmlhttp.response); |
|
} |
|
}; |
|
xmlhttp.send(); |
|
}); |
|
}, |
|
// 下载 |
|
handleDownload(row) { |
|
getPlanDetail({ id: row.id }).then(res => { |
|
let data = res.data.data.attaches |
|
if (data.length > 1) { |
|
const zip = new JSZip(); |
|
// 下载后压缩包的名称 |
|
const blogTitle = '合同.zip' |
|
const cache = {}; |
|
const promises = []; |
|
data.forEach(item => { |
|
if (item.link) { |
|
const promise = this.getFile(item.link).then(data => { |
|
// *下载文件, 并存成ArrayBuffer对象 |
|
const arr_name = item.name.split("/"); |
|
const file_name = arr_name[arr_name.length - 1]; // *获取文件名 |
|
zip.file(file_name, data, { binary: true }); // *逐个添加文件 |
|
cache[file_name] = data; |
|
}); |
|
promises.push(promise); |
|
} |
|
}); |
|
Promise.all(promises).then(() => { |
|
zip.generateAsync({ |
|
type: "blob", compression: 'DEFLATE', // *STORE: 默认不压缩; DEFLATE:需要压缩 |
|
compressionOptions: { |
|
level: 9 // *压缩等级 1~9。1: 压缩速度最快,9: 最优压缩方式 |
|
} |
|
}).then(content => { |
|
saveAs(content, blogTitle); // *生成二进制流,利用file-saver保存文件,文件名自定义 |
|
}); |
|
}); |
|
} else if (data.length == 1) { |
|
fetch(data[0].link, { |
|
method: 'get', |
|
heanders: { |
|
'Content-Type': 'application/json;charset=UTF-8' |
|
} |
|
}) |
|
.then(res => res.blob()) |
|
.then(blob => { |
|
const link = document.createElement('a') |
|
link.style.display = 'none' |
|
link.download = data[0].name// 设置下载属性 以及文件名 |
|
link.href = URL.createObjectURL(blob) |
|
|
|
document.body.appendChild(link) |
|
link.click() |
|
// 释放的 URL 对象以及移除 a 标签 |
|
URL.revokeObjectURL(link.href) |
|
document.body.removeChild(link) |
|
}) |
|
}else{ |
|
this.$message.error('该巡检内容没有维护合同附件') |
|
} |
|
}) |
|
}, |
|
/** |
|
* 方法一 |
|
* table合并行通用 */ |
|
mergeTableRow(data, merge) { |
|
if (!merge || merge.length === 0) { |
|
return data |
|
} |
|
merge.forEach((m) => { |
|
const mList = {} |
|
data = data && data.map((v, index) => { |
|
const rowVal = v[m] |
|
if (mList[rowVal] && mList[rowVal].newIndex === index) { |
|
mList[rowVal]['num']++ |
|
mList[rowVal]['newIndex']++ |
|
data[mList[rowVal]['index']][m + '-span'].rowspan++ |
|
v[m + '-span'] = { |
|
rowspan: 0, |
|
colspan: 0 |
|
} |
|
} else { |
|
mList[rowVal] = { num: 1, index: index, newIndex: index + 1 } |
|
v[m + '-span'] = { |
|
rowspan: 1, |
|
colspan: 1 |
|
} |
|
} |
|
return v |
|
}) |
|
}) |
|
return data |
|
}, |
|
|
|
handleAdd() { |
|
this.dialogTitle = '新建' |
|
this.dialogVisible = true |
|
this.detailForm = {} |
|
this.detailForm.tableData = [] |
|
this.getLeftLab() |
|
}, |
|
handleView(row) { |
|
getPlanDetail({ id: row.id }).then(res => { |
|
console.log('res==============>', res) |
|
this.dialogTitle = '查看' |
|
if (res.data.code == 200) { |
|
this.detailForm = res.data.data |
|
this.dialogVisible = true |
|
} |
|
}) |
|
}, |
|
handleEdit(row) { |
|
getPlanDetail({ id: row.id }).then(res => { |
|
console.log('res==============>', res) |
|
this.dialogTitle = '编辑' |
|
if (res.data.code == 200) { |
|
this.detailForm = res.data.data |
|
this.dialogVisible = true |
|
} |
|
}) |
|
}, |
|
handleCancel() { |
|
this.dialogTitle = '' |
|
this.$refs.addDialog.addForm = { |
|
tableData: [] |
|
} |
|
this.$refs.addDialog.tableData = [] |
|
this.$refs.addDialog.floorArr = [] |
|
this.$refs.addDialog.activeFloor = '' |
|
this.$refs.addDialog.activeRoom = '' |
|
this.$refs.addDialog.roomArr = [] |
|
this.dialogVisible = false |
|
}, |
|
|
|
getLeftLab() { |
|
getLimsTree().then(res => { |
|
console.log('res==============>', res) |
|
this.treeData = res.data.data |
|
this.unitData = res.data.data.filter(item => item.parentId == 0) |
|
console.log('unitData============>', this.unitData) |
|
}) |
|
}, |
|
nodeClick(data) { |
|
this.treeDeptId = data.id; |
|
this.page.currentPage = 1; |
|
this.onLoad(this.page); |
|
}, |
|
currentChange(currentPage) { |
|
this.page.currentPage = currentPage; |
|
}, |
|
sizeChange(pageSize) { |
|
this.page.pageSize = pageSize; |
|
}, |
|
searchChange(params, done) { |
|
this.onLoad() |
|
done() |
|
}, |
|
searchReset(params, done) { |
|
this.onLoad() |
|
done() |
|
}, |
|
refreshChange() { |
|
this.onLoad(this.page, this.query); |
|
}, |
|
handleConfirm() { |
|
console.log('addDialog==========>', this.$refs.addDialog) |
|
let addForm = this.$refs.addDialog.addForm |
|
// this.$refs.addDialog.tableData.map(item => { |
|
// item.nextStartTime = item.startTime |
|
// }) |
|
let arr = [] |
|
let arr1 = [] |
|
this.$refs.addDialog.filesList.map(item => { |
|
arr.push({ |
|
name: item.name, |
|
link: item.url |
|
}) |
|
}) |
|
this.$refs.addDialog.drawfiles.map(item => { |
|
arr1.push({ |
|
name: item.name, |
|
link: item.url |
|
}) |
|
}) |
|
let query = { |
|
id: addForm.id ? addForm.id : null, // 编辑的时候传 |
|
deptId: addForm.unitId, // 实验室id |
|
deptName: addForm.unitName, // 实验室名称 |
|
planContent: addForm.content, // 巡检说明 |
|
details: this.$refs.addDialog.tableData, |
|
attaches: arr, |
|
draws:arr1 |
|
} |
|
console.log('query===========>', query) |
|
if (query.id) { |
|
editPlan(query).then(res => { |
|
if (res.data.code == 200) { |
|
this.$message.success('编辑成功') |
|
this.onLoad() |
|
this.$refs.addDialog.addForm = {} |
|
this.$refs.addDialog.floorArr = [] |
|
this.$refs.addDialog.roomArr = [] |
|
this.$refs.addDialog.activeFloor = '' |
|
this.$refs.addDialog.activeRoom = '' |
|
this.dialogVisible = false |
|
} |
|
}) |
|
} else { |
|
planCreate(query).then(res => { |
|
console.log('res=======>', res) |
|
if (res.data.code == 200) { |
|
this.$message.success('新增成功') |
|
this.onLoad() |
|
this.$refs.addDialog.addForm = {} |
|
this.$refs.addDialog.floorArr = [] |
|
this.$refs.addDialog.roomArr = [] |
|
this.$refs.addDialog.activeFloor = '' |
|
this.$refs.addDialog.activeRoom = '' |
|
this.dialogVisible = false |
|
} |
|
}) |
|
} |
|
|
|
}, |
|
onLoad(page, params = {}) { |
|
let query = { |
|
deptName: this.search.deptName ? this.search.deptName : null, //单位名称 |
|
current: this.page.currentPage, //页数 |
|
size: this.page.pageSize //条数 |
|
} |
|
this.loading = true |
|
getContentList(query).then(res => { |
|
this.data = res.data.data.records |
|
this.page.total = res.data.data.total |
|
this.loading = false |
|
}) |
|
}, |
|
} |
|
}; |
|
</script> |
|
|
|
<style> |
|
.box { |
|
height: 800px; |
|
} |
|
|
|
.el-scrollbar { |
|
height: 100%; |
|
} |
|
|
|
.box .el-scrollbar__wrap { |
|
overflow: scroll; |
|
} |
|
</style>
|
|
|