<template>
|
<div class="mod-config">
|
<basic-container>
|
<ttable
|
:table="table"
|
@handleSelectionChange="handleSelectionChange"
|
@tableRowClassName="tableRowClassName"
|
:prelang="prelang"
|
:options="options"
|
:ajaxFun="ajaxFun"
|
ref="documentTable"
|
>
|
<template #toolbar>
|
<!-- <el-button type="primary" :loading="ifsSynsLoading" @click="syncIfs"
|
>ERP同步</el-button
|
> -->
|
<el-button
|
type="primary"
|
@click="deleteBatch"
|
v-if="permissions.technology_document_del"
|
>批量删除</el-button
|
>
|
<!-- <el-button
|
type="primary"
|
@click="bindTestStandard"
|
v-if="permissions.technology_document_standard_upload"
|
>批量绑定检测标准</el-button
|
> -->
|
</template>
|
</ttable>
|
<el-dialog
|
title="导入"
|
:visible.sync="importTestStandardVisible"
|
width="50%"
|
>
|
<div>
|
<el-upload
|
style="margin-left:8px;display: inline;"
|
class="upload-demo"
|
drag
|
:headers="headers"
|
:action="testStandardUploadInfo.url"
|
:beforeUpload="beforeAvatarUpload"
|
:limit="1"
|
:show-file-list="false"
|
:file-list="testStandardFileList"
|
:on-success="testStandardFileSuccessUploadScan"
|
:on-error="handleError"
|
accept=".xlsx,.xls,.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
|
:auto-upload="true"
|
ref="testStandardUploadScan"
|
multiple
|
>
|
<i class="el-icon-upload"></i>
|
<div class="el-upload__text"><em>导入数据</em></div>
|
<div class="el-upload__tip" slot="tip">
|
只能上传xlsx/xls文件,且不超过10M<el-button
|
type="text"
|
style="font-size:12px;"
|
@click="downTestStandardDataTemplate"
|
>下载模板</el-button
|
>
|
</div>
|
</el-upload>
|
</div>
|
</el-dialog>
|
</basic-container>
|
</div>
|
</template>
|
<script>
|
import {
|
fetchList,
|
delObj,
|
startOa,
|
exportDocumentWord,
|
changeState,
|
ifsSync,
|
batchDel,
|
uploadDocumentTestStandardTemplate
|
} from '@/api/technology/document'
|
import ttable from '@/views/common/ztt-table.vue'
|
import { mapGetters } from 'vuex'
|
import { copyDocument } from '../../../api/technology/document'
|
import { remote } from '@/api/admin/dict'
|
import { getStore } from '@/util/store.js'
|
|
export default {
|
data() {
|
return {
|
ids: [],
|
ajaxFun: fetchList,
|
multipleSelection: [],
|
isShowQuery: false,
|
prelang: 'routing',
|
options: {
|
height: 300, // 默认高度-为了表头固定
|
stripe: true, // 是否为斑马纹 table
|
highlightCurrentRow: false, // 是否要高亮当前行
|
border: true, // 是否有纵向边框
|
lazy: false, // 是否需要懒加载
|
fit: true, // 列的宽度是否自撑开
|
multiSelect: true, //
|
seqNo: true,
|
isRefresh: true, // 是否显示刷新按钮
|
isShowHide: true, // 是否显示显影按钮H
|
isSearch: true, // 高级查询按钮
|
defaultOrderBy: { column: 'createTime', direction: 'desc' }
|
},
|
table: {
|
total: 0,
|
currentPage: 1,
|
pageSize: 20,
|
data: [],
|
column: [
|
{
|
minWidth: '140',
|
prop: 'name',
|
label: '文件名称',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text',
|
render: { fun: this.addOrUpdateHandle }
|
},
|
{
|
minWidth: '120',
|
prop: 'number',
|
label: '文件编号',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text',
|
noShowTip: false
|
},
|
{
|
minWidth: '120',
|
prop: 'partNo',
|
label: '零件编号',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text'
|
},
|
// // 绝缘颜色
|
// {
|
// minWidth: '120',
|
// prop: 'insulationColor',
|
// label: '绝缘颜色',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'text'
|
// },
|
// // 护套颜色
|
// {
|
// minWidth: '120',
|
// prop: 'sheathColor',
|
// label: '护套颜色',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'text'
|
// },
|
{
|
minWidth: '120',
|
prop: 'testStandard',
|
label: '检测标准绑定',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'select',
|
optList: () => {
|
return this.getTestStandardList()
|
},
|
formatter: (row, column, cellValue) => {
|
var formatVal = ''
|
if (cellValue) {
|
formatVal = '是'
|
} else {
|
formatVal = '否'
|
}
|
return formatVal
|
}
|
},
|
{
|
minWidth: '120',
|
prop: 'state',
|
label: '状态',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'select',
|
optList: () => {
|
return this.getStateOptionList()
|
},
|
formatter: (row, column, cellValue) => {
|
var formatVal
|
if (cellValue == '01draft') {
|
formatVal = '草稿'
|
} else if (cellValue == '02pending') {
|
formatVal = '待审批'
|
} else if (cellValue == '03accepted') {
|
formatVal = '已审批'
|
} else {
|
formatVal = '已驳回'
|
}
|
return formatVal
|
}
|
},
|
{
|
minWidth: '120',
|
prop: 'docType',
|
label: '类型',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'select',
|
formatter: this.formatBomTypeDbType,
|
optList: () => {
|
return this.bomTypeDbOptions
|
}
|
},
|
{
|
minWidth: '120',
|
prop: 'version',
|
label: '版本号',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text',
|
noShowTip: false
|
},
|
// {
|
// minWidth: '120',
|
// prop: 'projectNo',
|
// label: '项目号',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'text'
|
// },
|
// {
|
// minWidth: '120',
|
// prop: 'projectType',
|
// label: '项目类别',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'select',
|
// optList: () => {
|
// return this.getProjectTypeOptionList()
|
// },
|
// formatter: (row, column, cellValue) => {
|
// var formatVal
|
// if (cellValue == 0) {
|
// formatVal = '国内项目'
|
// } else if (cellValue == 1) {
|
// formatVal = '特缆研发项目'
|
// } else {
|
// formatVal = ''
|
// }
|
// return formatVal
|
// }
|
// },
|
// {
|
// minWidth: '120',
|
// prop: 'country',
|
// label: '国家',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'text'
|
// },
|
|
// 描述
|
{
|
minWidth: '120',
|
prop: 'remark',
|
label: '备注',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text'
|
},
|
// 更新时间
|
{
|
minWidth: '200',
|
prop: 'createUser',
|
label: '创建人',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text'
|
},
|
// 创建时间
|
{
|
minWidth: '200',
|
prop: 'createTime',
|
label: '创建时间',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'datetimerange'
|
},
|
{
|
minWidth: '200',
|
prop: 'updateRealUser',
|
label: '更新人',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text'
|
},
|
// 创建时间
|
{
|
minWidth: '200',
|
prop: 'updateRealTime',
|
label: '更新时间',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'datetimerange'
|
}
|
],
|
toolbar: [
|
{
|
text: '新增',
|
type: 'primary',
|
fun: this.addOrUpdateHandle,
|
disabled: false,
|
permitArr: []
|
},
|
{
|
text: '复制',
|
fun: this.copyDocument,
|
disabled: false,
|
permitArr: []
|
},
|
{
|
text: '批准',
|
fun: () => {
|
this.changeState('accept')
|
},
|
disabled: false,
|
permitArr: ['01draft', '03accepted', '04reject']
|
},
|
{
|
text: '拒绝',
|
fun: () => {
|
this.changeState('reject')
|
},
|
disabled: false,
|
permitArr: ['01draft', '03accepted', '04reject']
|
},
|
{
|
text: '撤销',
|
fun: () => {
|
this.changeState('cancel')
|
},
|
disabled: false,
|
permitArr: ['01draft', '03accepted', '04reject']
|
}
|
/*,
|
{
|
text: '海缆OA',
|
fun: () => {
|
this.approveHandle(0)
|
},
|
disabled: false,
|
permitArr: ['01draft', '04reject'],
|
loading: false
|
},
|
{
|
text: '陆缆OA',
|
fun: () => {
|
this.approveHandle(1)
|
},
|
disabled: false,
|
permitArr: ['01draft', '04reject'],
|
loading: false
|
},
|
{
|
text: '导出word',
|
type: 'primary',
|
fun: this.exportWord,
|
disabled: false,
|
permitArr: []
|
} */
|
],
|
operator: [],
|
operatorConfig: {
|
fixed: 'right',
|
label: '操作',
|
width: 100,
|
minWidth: 100
|
}
|
},
|
addOrUpdateVisible: false,
|
projectTypeOptionList: [
|
{
|
value: 0,
|
label: '国内项目'
|
},
|
{
|
value: 1,
|
label: '特缆研发项目'
|
}
|
],
|
stateOptionList: [
|
{
|
value: '01draft',
|
label: '草稿'
|
},
|
{
|
value: '02pending',
|
label: '待审批'
|
},
|
{
|
value: '03accepted',
|
label: '已审批'
|
},
|
{
|
value: '04reject',
|
label: '已驳回'
|
}
|
],
|
testStandardList: [
|
{
|
value: true,
|
label: '是'
|
},
|
{
|
value: false,
|
label: '否'
|
}
|
],
|
ifsSynsLoading: false,
|
bomTypeDbOptions: [],
|
importTestStandardVisible: false,
|
headers: {
|
Authorization: 'Bearer ' + getStore({ name: 'access_token' })
|
},
|
testStandardUploadInfo: {
|
// 是否展示上传EXCEL以及对应的url
|
isShow: true,
|
url: '/mes/document/upload'
|
},
|
testStandardFileList: []
|
}
|
},
|
components: {
|
ttable
|
},
|
computed: {
|
...mapGetters(['permissions'])
|
},
|
activated() {
|
this.getData()
|
},
|
created() {
|
this.getBomTypeDbOptions()
|
if (this.permissions.technology_document_del) {
|
this.table.operator.push({
|
text: '删除',
|
type: 'text',
|
size: 'small',
|
fun: this.deleteHandle,
|
show: {
|
val: ['01draft'],
|
key: 'state'
|
}
|
})
|
} else {
|
this.table.operator.push({
|
text: '删除',
|
type: 'text',
|
size: 'small',
|
fun: this.deleteHandle,
|
show: {
|
val: [],
|
key: 'state'
|
}
|
})
|
}
|
},
|
methods: {
|
getBomTypeDbOptions() {
|
remote('bom_type_db').then((response) => {
|
if (response.data.code === 0) {
|
this.bomTypeDbOptions = response.data.data
|
} else {
|
this.bomTypeDbOptions = []
|
}
|
})
|
},
|
// 工艺类型中文格式化
|
formatBomTypeDbType(row, column, cellValue) {
|
this.bomTypeDbOptions.forEach((obj) => {
|
if (obj.value === cellValue) {
|
cellValue = obj.label
|
}
|
})
|
return cellValue
|
},
|
changeState(event) {
|
const that = this
|
if (that.multipleSelection.length > 0) {
|
const ids = []
|
that.multipleSelection.forEach((item) => {
|
ids.push(item.id)
|
})
|
changeState(ids, event).then(function() {
|
that.getData()
|
})
|
} else {
|
this.$message.error('请选择某条工艺文件')
|
}
|
},
|
getData() {
|
if (this.$refs.documentTable !== undefined) {
|
this.$refs.documentTable.getDataList()
|
}
|
},
|
// 新增 / 修改
|
addOrUpdateHandle(row) {
|
this.$router.push({
|
name: 'documentForm',
|
query: { id: row == null ? null : row.id }
|
})
|
},
|
// 删除
|
deleteHandle(row) {
|
this.$confirm('是否确认删除工艺文件编号:' + row.number + '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
closeOnClickModal: false,
|
type: 'warning'
|
})
|
.then(function() {
|
return delObj(row.id)
|
})
|
.then((response) => {
|
var data = response.data
|
if (data.code === 0) {
|
this.$message.success('删除成功')
|
} else {
|
this.$message.error('删除失败')
|
}
|
this.getData()
|
})
|
},
|
getProjectTypeOptionList() {
|
return this.projectTypeOptionList
|
},
|
getStateOptionList() {
|
return this.stateOptionList
|
},
|
getTestStandardList() {
|
return this.testStandardList
|
},
|
copyDocument() {
|
if (this.multipleSelection != null && this.multipleSelection.length > 0) {
|
if (this.multipleSelection.length == 1) {
|
copyDocument(this.multipleSelection).then((response) => {
|
if (response.data.code == 0) {
|
this.$message.success('复制工艺文件成功')
|
}
|
this.getData()
|
})
|
} else {
|
this.$message.error('只能复制一条工艺文件')
|
}
|
}
|
},
|
handleSelectionChange(val) {
|
// 根据状态,禁用表头按钮
|
// 筛选出选中记录的状态
|
var stateArr = val.map(function(value, index) {
|
return value.state
|
})
|
// 选中状态数组元素去重
|
var uniqueStateArr = []
|
for (var i = 0; i < stateArr.length; i++) {
|
if (uniqueStateArr.indexOf(stateArr[i]) == -1) {
|
uniqueStateArr.push(stateArr[i])
|
}
|
}
|
// 循环表头按钮,判断每个按钮的permitArr是否完全包含选中状态,若完全包含,则按钮亮,否则按钮灰
|
var toolbar = this.table.toolbar
|
for (var j = 0; j < toolbar.length; j++) {
|
if (
|
uniqueStateArr.every((val) =>
|
toolbar[j].permitArr.length <= 0
|
? true
|
: toolbar[j].permitArr.includes(val)
|
)
|
) {
|
toolbar[j].disabled = false
|
} else {
|
toolbar[j].disabled = true
|
}
|
}
|
// 将选中记录赋值给multipleSelection
|
this.multipleSelection = val
|
},
|
currentChange(val) {
|
// 根据状态,禁用表头按钮
|
// 筛选出选中记录的状态
|
var selectVals = []
|
if (val != null) {
|
selectVals.push(val)
|
var stateArr = selectVals.map(function(value, index) {
|
return value.state
|
})
|
// 选中状态数组元素去重
|
var uniqueStateArr = []
|
for (var i = 0; i < stateArr.length; i++) {
|
if (uniqueStateArr.indexOf(stateArr[i]) === -1) {
|
uniqueStateArr.push(stateArr[i])
|
}
|
}
|
// 循环表头按钮,判断每个按钮的permitArr是否完全包含选中状态,若完全包含,则按钮亮,否则按钮灰
|
var toolbar = this.table.toolbar
|
for (var j = 0; j < toolbar.length; j++) {
|
if (
|
uniqueStateArr.every((val) =>
|
toolbar[j].permitArr.length <= 0
|
? true
|
: toolbar[j].permitArr.includes(val)
|
)
|
) {
|
toolbar[j].disabled = false
|
} else {
|
toolbar[j].disabled = true
|
}
|
}
|
}
|
// 将选中记录赋值给multipleSelection
|
this.multipleSelection = selectVals
|
},
|
// 发起OA
|
approveHandle(oaType) {
|
var title = '海缆OA'
|
if (oaType == 1) {
|
title = '陆缆OA'
|
}
|
if (this.multipleSelection.length > 0) {
|
const toolbar = this.table.toolbar.find((item) => item.text === title)
|
if (toolbar) {
|
toolbar.loading = true
|
startOa(this.multipleSelection[0].id, oaType)
|
.then((response) => {
|
var data = response.data
|
if (data.code === 0) {
|
this.$message.success('发起OA成功')
|
this.getData()
|
} else {
|
this.$message.error('发起OA失败')
|
}
|
toolbar.loading = false
|
})
|
.catch(() => {
|
toolbar.loading = false
|
})
|
}
|
} else {
|
this.$message.error('请选择发起OA的对象')
|
}
|
},
|
exportWord() {
|
if (this.multipleSelection.length > 0) {
|
exportDocumentWord(this.multipleSelection[0].id).then((res) => {
|
const blob = new Blob([res.data], {
|
type: 'application/msword'
|
})
|
const downloadElement = document.createElement('a') // 新建一个DOM节点
|
const href = window.URL.createObjectURL(blob) // 创建下载的链接
|
downloadElement.href = href
|
downloadElement.download = '工艺文件.docx' // 下载后文件名
|
document.body.appendChild(downloadElement) // 将新增的节点挂载到页面上
|
downloadElement.click() // 点击下载
|
document.body.removeChild(downloadElement) // 下载完成移除元素
|
window.URL.revokeObjectURL(href)
|
})
|
} else {
|
this.$message.error('请选择导出的对象')
|
}
|
},
|
// 背景色
|
tableRowClassName(row, callback) {
|
let result = ''
|
if (row.isSubmit && !row.isConfirm) {
|
result = 'danger-light-row'
|
} else if (row.isSubmit && row.isConfirm) {
|
result = 'danger-row'
|
}
|
callback(result)
|
},
|
// 同步IFS
|
syncIfs() {
|
if (this.multipleSelection != null && this.multipleSelection.length > 0) {
|
if (this.multipleSelection.length == 1) {
|
this.ifsSynsLoading = true
|
ifsSync(this.multipleSelection[0].id)
|
.then((response) => {
|
const resData = response.data
|
if (resData.code === 0) {
|
this.$message.success('ERP同步成功')
|
this.getData()
|
} else {
|
this.$message.error('ERP同步失败')
|
}
|
this.ifsSynsLoading = false
|
})
|
.catch(() => {
|
this.ifsSynsLoading = false
|
})
|
} else {
|
this.$message.error('只能同步一条工艺文件')
|
}
|
} else {
|
this.$message.error('请先选择工艺文件')
|
}
|
},
|
deleteBatch() {
|
const that = this
|
if (that.multipleSelection.length > 0) {
|
const ids = []
|
let stateFlag = true
|
that.multipleSelection.forEach((item) => {
|
ids.push(item.id)
|
if (item.state !== '01draft') {
|
stateFlag = false
|
}
|
})
|
if (stateFlag) {
|
batchDel(ids).then((response) => {
|
const resData = response.data
|
if (resData.code === 0) {
|
this.$message.success('批量删除成功')
|
this.getData()
|
} else {
|
this.$message.error('批量删除失败')
|
}
|
})
|
} else {
|
this.$message.error('只有草稿状态的工艺文件才能删除')
|
}
|
} else {
|
this.$message.error('请选择某条工艺文件')
|
}
|
},
|
bindTestStandard() {
|
this.importTestStandardVisible = true
|
},
|
// 限制文件上传大小,目前限制为10M(另可以加类型限制)
|
beforeAvatarUpload(file) {
|
const fileName = file.name
|
const fileType = fileName.substring(fileName.lastIndexOf('.') + 1)
|
const isLt10M = file.size / 1024 / 1024 < 10
|
if (fileType !== 'xlsx' && fileType !== 'xls') {
|
this.$message.error('文件格式只能为xlsx或xls,请删除后重新上传')
|
}
|
if (!isLt10M) {
|
this.$message({
|
message: '文件大小',
|
type: 'warning'
|
})
|
}
|
return isLt10M
|
},
|
// 文件上传成功回调事件
|
testStandardFileSuccessUploadScan(response, file, fileList) {
|
if (response.code != '0') {
|
this.$message.warning(response.msg)
|
} else {
|
this.$message({
|
message: '上传成功',
|
type: 'success'
|
})
|
this.getData()
|
}
|
this.$refs.testStandardUploadScan.clearFiles()
|
},
|
// 上传失败
|
handleError(err, file, fileList) {
|
const error = JSON.parse(err.message)
|
if (error.msg) {
|
this.$message.error(error.msg)
|
} else {
|
this.$message.error('上传失败')
|
}
|
},
|
// 下载装备数据模板
|
downTestStandardDataTemplate() {
|
uploadDocumentTestStandardTemplate().then((response) => {
|
const blob = new Blob([response.data], {
|
type: 'application/force-download'
|
})
|
const filename = decodeURI('模板文件.xlsx')
|
// 创建一个超链接,将文件流赋进去,然后实现这个超链接的单击事件
|
const elink = document.createElement('a')
|
elink.download = filename
|
elink.style.display = 'none'
|
elink.href = URL.createObjectURL(blob)
|
document.body.appendChild(elink)
|
elink.click()
|
URL.revokeObjectURL(elink.href) // 释放URL 对象
|
document.body.removeChild(elink)
|
})
|
}
|
}
|
}
|
</script>
|