<template>
|
<div class="mod-config">
|
<basic-container>
|
<ttable
|
:table="table"
|
@handleSelectionChange="handleSelectionChange"
|
@customUploadPage="routingImport"
|
:uploadInfo="uploadInfo"
|
:customUpload="customUpload"
|
:prelang="prelang"
|
:options="options"
|
:ajaxFun="ajaxFun"
|
ref="routingTable"
|
>
|
<template #toolbar>
|
<!-- <el-button
|
v-if="permissions.technology_routing_ifssync"
|
type="primary"
|
:loading="ifsSynsLoading"
|
@click="syncIfs"
|
>IFS同步</el-button
|
> -->
|
<el-button
|
v-if="permissions.technology_routing_advancecalc"
|
type="primary"
|
:loading="preCalcLoading"
|
@click="calcTech"
|
>提前计算</el-button
|
>
|
</template>
|
</ttable>
|
<el-dialog title="导入" :visible.sync="importRoutingVisible" width="50%">
|
<span>
|
<div style="display:flex;justify-content:space-around;">
|
<div>
|
<el-upload
|
style="margin-left:8px;display: inline;"
|
class="upload-demo"
|
drag
|
:headers="headers"
|
:action="zhuangbeiUploadInfo.url"
|
:beforeUpload="beforeAvatarUpload"
|
:limit="1"
|
:show-file-list="false"
|
:file-list="zhuangbeifileList"
|
:data="zhuangbeiUploadInfo.uploadData"
|
:on-success="zhuangbeiFileSuccessUploadScan"
|
:on-error="handleError"
|
accept=".xlsx,.xls,.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
|
:auto-upload="true"
|
ref="zhuangbeiUploadScan"
|
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="downZhuangbeiDataTemplate"
|
>下载模板</el-button
|
>
|
</div>
|
</el-upload>
|
</div>
|
<div>
|
<el-upload
|
style="margin-left:8px;display: inline;"
|
class="upload-demo"
|
drag
|
:headers="headers"
|
:action="shepinUploadInfo.url"
|
:beforeUpload="beforeAvatarUpload"
|
:limit="1"
|
:show-file-list="false"
|
:file-list="shepinfileList"
|
:data="shepinUploadInfo.uploadData"
|
:on-success="shepinFileSuccessUploadScan"
|
:on-error="handleError"
|
accept=".xlsx,.xls,.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
|
:auto-upload="true"
|
ref="shepinUploadScan"
|
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="downShepinDataTemplate"
|
>下载模板</el-button
|
>
|
</div>
|
</el-upload>
|
</div>
|
</div>
|
</span>
|
</el-dialog>
|
<partDialog
|
:currshowlist.sync="showPart"
|
@listenToPartEvent="selectPart"
|
/>
|
</basic-container>
|
</div>
|
</template>
|
<style>
|
.dividerClass {
|
height: 25em;
|
margin: 0 50%;
|
}
|
</style>
|
<script>
|
import {
|
fetchList,
|
delObj,
|
changeState,
|
changeStateBatch,
|
exportRoutingTemplate,
|
routingIfsSync,
|
routingIfsCal
|
} from '@/api/technology/routing'
|
import ttable from '@/views/common/ztt-table.vue'
|
import TableForm from './routing-form'
|
import { mapGetters } from 'vuex'
|
import { copyRoutingSave } from '../../../api/technology/routing'
|
import { remote } from '@/api/admin/dict'
|
import { getStore } from '@/util/store.js'
|
import { uploadTemplate } from '@/api/basic/template'
|
import partDialog from '@/views/common/part.vue'
|
export default {
|
data() {
|
return {
|
ids: [],
|
ajaxFun: fetchList,
|
multipleSelection: [],
|
isShowQuery: false,
|
customUpload: true,
|
uploadInfo: {
|
// 是否展示上传EXCEL以及对应的url
|
isShow: true,
|
url: '/mes/routing/uploadExcel'
|
},
|
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: 'updateTime', direction: 'desc' }
|
},
|
table: {
|
total: 0,
|
currentPage: 1,
|
pageSize: 20,
|
data: [],
|
// 标题
|
column: [
|
// 工序编号render:(h, scope) => { return h('span', { on: { click: this.addOrUpdateHandle.bind(this,scope.row) }, style: { color: '#409eff', cursor: 'pointer', } }, scope.row.routingNo) }
|
{
|
minWidth: '140',
|
prop: 'routingNo',
|
label: '工艺编号',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text',
|
render: { fun: this.addOrUpdateHandle }
|
},
|
// 工序名称
|
{
|
minWidth: '120',
|
prop: 'partName',
|
label: '零件名',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text',
|
noShowTip: false
|
},
|
{
|
minWidth: '120',
|
prop: 'partNo',
|
label: '零件号',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text',
|
noShowTip: false
|
},
|
// 是否为主工艺
|
{
|
minWidth: '120',
|
prop: 'master',
|
label: '主工艺',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'select',
|
optList: () => {
|
return this.getMasterOptionList()
|
},
|
formatter: (row, column, cellValue) => {
|
return cellValue == true ? '是' : '否'
|
}
|
},
|
// 状态
|
{
|
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 == '02accepted') {
|
formatVal = '已接受'
|
} else {
|
formatVal = '已拒绝'
|
}
|
return formatVal
|
}
|
},
|
// 描述
|
{
|
minWidth: '120',
|
prop: 'description',
|
label: '备注',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text'
|
},
|
// 描述
|
{
|
minWidth: '120',
|
prop: 'bomNo',
|
label: 'BOM编号',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text'
|
},
|
// 工艺版本
|
{
|
minWidth: '120',
|
prop: 'version',
|
label: '工艺版本',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'text'
|
},
|
// 工艺类型
|
{
|
minWidth: '120',
|
prop: 'bomTypeDb',
|
label: '工艺类型',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'select',
|
formatter: this.formatBomTypeDbType,
|
optList: () => {
|
return this.bomTypeDbOptions
|
}
|
},
|
// 逐步采用日期
|
// {
|
// minWidth: '200',
|
// prop: 'phaseInDate',
|
// label: '逐步采用日期',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'datetimerange'
|
// },
|
// 逐步淘汰日期
|
// {
|
// minWidth: '200',
|
// prop: 'phaseOutDate',
|
// label: '逐步淘汰日期',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'datetimerange'
|
// },
|
// 替代
|
// {
|
// minWidth: '120',
|
// prop: 'alternativeNo',
|
// label: '替代',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'text'
|
// },
|
// 替代描述
|
// {
|
// minWidth: '120',
|
// prop: 'alternativeDesc',
|
// label: '替代描述',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'text'
|
// },
|
// 是否已同步至IFS
|
// {
|
// minWidth: '120',
|
// prop: 'ifsSync',
|
// label: '已同步至IFS',
|
// sort: true,
|
// isTrue: true,
|
// isSearch: true,
|
// searchInfoType: 'select',
|
// optList: () => {
|
// return this.getIfsSyncOptionList()
|
// },
|
// formatter: (row, column, cellValue) => {
|
// return cellValue == true ? '是' : '否'
|
// }
|
// },
|
// 更新时间
|
{
|
minWidth: '200',
|
prop: 'updateTime',
|
label: '更新时间',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'datetimerange'
|
},
|
// 创建时间
|
{
|
minWidth: '200',
|
prop: 'createTime',
|
label: '创建时间',
|
sort: true,
|
isTrue: true,
|
isSearch: true,
|
searchInfoType: 'datetimerange'
|
}
|
],
|
toolbar: [
|
{
|
text: '新增',
|
type: 'primary',
|
fun: this.addOrUpdateHandle,
|
disabled: false,
|
permitArr: []
|
},
|
{
|
text: '批准',
|
fun: () => {
|
this.approveHandle('ACCEPT')
|
},
|
disabled: false,
|
permitArr: ['01draft']
|
},
|
{
|
text: '撤回',
|
fun: () => {
|
this.approveHandle('REVOKE')
|
},
|
disabled: false,
|
permitArr: ['02accepted']
|
},
|
{
|
text: '拒绝',
|
fun: () => {
|
this.approveHandle('CANCEL')
|
},
|
disabled: false,
|
permitArr: ['02accepted']
|
},
|
{
|
text: '复制',
|
fun: this.copyRouting,
|
disabled: false,
|
permitArr: []
|
},
|
{
|
text: '删除',
|
fun: () => {
|
this.deleteAll()
|
},
|
disabled: false,
|
permitArr: []
|
}
|
],
|
operator: [
|
{
|
text: '删除',
|
type: 'text',
|
size: 'small',
|
fun: this.deleteHandle
|
// show: {
|
// val: ['01draft'],
|
// key: 'state'
|
// }
|
}
|
],
|
operatorConfig: {
|
fixed: 'right',
|
label: '操作',
|
width: 100,
|
minWidth: 100
|
}
|
},
|
addOrUpdateVisible: false,
|
masterOptionList: [
|
{
|
value: true,
|
label: '是'
|
},
|
{
|
value: false,
|
label: '否'
|
}
|
],
|
stateOptionList: [
|
{
|
value: '01draft',
|
label: '草稿'
|
},
|
{
|
value: '02accepted',
|
label: '已接受'
|
},
|
{
|
value: '03cancelled',
|
label: '已取消'
|
}
|
],
|
bomTypeDbOptions: [],
|
ifsSyncOptionList: [
|
{
|
value: true,
|
label: '是'
|
},
|
{
|
value: false,
|
label: '否'
|
}
|
],
|
importRoutingVisible: false,
|
headers: {
|
Authorization: 'Bearer ' + getStore({ name: 'access_token' })
|
},
|
shepinUploadInfo: {
|
// 是否展示上传EXCEL以及对应的url
|
isShow: true,
|
url: '/mes/routing/upload'
|
},
|
zhuangbeiUploadInfo: {
|
// 是否展示上传EXCEL以及对应的url
|
isShow: true,
|
url: '/mes/routing/uploadExcel'
|
},
|
zhuangbeifileList: [],
|
shepinfileList: [],
|
showPart: false,
|
ifsSynsLoading: false,
|
preCalcLoading: false
|
}
|
},
|
components: {
|
ttable,
|
TableForm,
|
partDialog
|
},
|
computed: {
|
...mapGetters(['permissions'])
|
},
|
activated() {
|
this.getData()
|
},
|
created() {
|
this.getBomTypeDbOptions()
|
},
|
methods: {
|
getData() {
|
if (this.$refs.routingTable !== undefined) {
|
this.$refs.routingTable.getDataList()
|
}
|
},
|
// 查看记录详情
|
queryDetail(row) {
|
this.$router.push({
|
name: 'routingDetail',
|
params: { id: row == null ? null : row.id }
|
})
|
},
|
// 新增 / 修改
|
addOrUpdateHandle(row) {
|
this.$router.push({
|
name: 'routingForm',
|
query: { id: row == null ? null : row.id }
|
})
|
},
|
// 删除
|
deleteHandle(row) {
|
this.$confirm('是否确认删除工艺编号:' + row.routingNo + '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
closeOnClickModal: false,
|
type: 'warning'
|
})
|
.then(function() {
|
const ids = []
|
ids.push(row.id)
|
return delObj(ids)
|
})
|
.then((response) => {
|
var data = response.data
|
if (data.code == 0) {
|
this.$message.success('删除成功')
|
} else {
|
this.$message.error('删除失败')
|
}
|
this.getData()
|
})
|
},
|
// 批量删除
|
deleteAll() {
|
const that = this
|
if (this.multipleSelection.length > 0) {
|
this.$confirm('是否确认删除工艺', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
closeOnClickModal: false
|
})
|
.then(function() {
|
const ids = that.multipleSelection.map((item) => {
|
return item.id
|
})
|
return delObj(ids)
|
})
|
.then((response) => {
|
var data = response.data
|
if (data.code === 0) {
|
this.$message.success('删除成功')
|
} else {
|
this.$message.error('删除失败')
|
}
|
this.getData()
|
})
|
} else {
|
this.$message.error('请选择需要删除的对象')
|
}
|
},
|
// 复制工艺路线
|
copyRouting() {
|
if (this.multipleSelection != null && this.multipleSelection) {
|
if (this.multipleSelection.length > 0) {
|
/* const ids = []
|
this.multipleSelection.forEach((item) => {
|
ids.push(item.id)
|
})
|
copyRoutingSave(ids).then((response) => {
|
var data = response.data
|
if (data.code == 0) {
|
this.$message.success('复制成功')
|
this.getData()
|
} else {
|
this.$message.error('复制失败')
|
}
|
}) */
|
if (this.multipleSelection.length === 1) {
|
copyRoutingSave(this.multipleSelection).then((response) => {
|
var data = response.data
|
if (data.code == 0) {
|
this.$message.success('复制成功')
|
this.getData()
|
} else {
|
this.$message.error('复制失败')
|
}
|
})
|
} else {
|
this.$message.error('只能进行单条工艺路线的复制')
|
}
|
} 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
|
},
|
getMasterOptionList() {
|
return this.masterOptionList
|
},
|
getStateOptionList() {
|
return this.stateOptionList
|
},
|
getIfsSyncOptionList() {
|
return this.ifsSyncOptionList
|
},
|
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
|
},
|
// 审批
|
approveHandle(event) {
|
var eventName
|
if (event == 'ACCEPT') {
|
eventName = '批准'
|
} else if (event == 'REVOKE') {
|
eventName = '撤回'
|
} else {
|
eventName = '拒绝'
|
}
|
if (this.multipleSelection.length > 0) {
|
changeStateBatch(
|
this.multipleSelection.map((item) => {
|
return item.id
|
}),
|
event
|
).then((response) => {
|
var data = response.data
|
if (data.code == 0) {
|
this.$message.success(eventName + '成功')
|
this.getData()
|
} else {
|
this.$message.error(eventName + '失败')
|
}
|
})
|
} else {
|
this.$message.error('请选择' + eventName + '的对象')
|
}
|
},
|
// 打开工艺路线导入
|
routingImport() {
|
this.importRoutingVisible = 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
|
},
|
// 文件上传成功回调事件
|
zhuangbeiFileSuccessUploadScan(response, file, fileList) {
|
if (response.code != '0') {
|
this.$message.warning(response.msg)
|
} else {
|
this.$message({
|
message: '上传成功',
|
type: 'success'
|
})
|
this.getData()
|
}
|
this.$refs.zhuangbeiUploadScan.clearFiles()
|
},
|
// 上传失败
|
handleError(err, file, fileList) {
|
const error = JSON.parse(err.message)
|
if (error.msg) {
|
this.$message.error(error.msg)
|
} else {
|
this.$message.error('上传失败')
|
}
|
},
|
// 下载装备数据模板
|
downZhuangbeiDataTemplate() {
|
const path = this.$route.path
|
const pathElArr = path.split('/')
|
// const query = { fileName: pathElArr[2] }
|
|
uploadTemplate(pathElArr[2]).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)
|
})
|
},
|
// 射频文件上传成功回调事件
|
shepinFileSuccessUploadScan(response, file, fileList) {
|
if (response.code != '0') {
|
this.$message.warning(response.msg)
|
} else {
|
this.$message({
|
message: '上传成功',
|
type: 'success'
|
})
|
this.getData()
|
}
|
this.$refs.shepinUploadScan.clearFiles()
|
},
|
// 下载射频数据模板
|
downShepinDataTemplate() {
|
exportRoutingTemplate().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)
|
})
|
},
|
selectPart(param) {
|
if (typeof param !== 'undefined') {
|
}
|
},
|
syncIfs() {
|
if (this.multipleSelection != null && this.multipleSelection.length > 0) {
|
if (this.multipleSelection.length <= 15) {
|
this.ifsSynsLoading = true
|
const ids = []
|
this.multipleSelection.forEach((item) => {
|
ids.push(item.id)
|
})
|
routingIfsSync(ids)
|
.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('最多可同时同步15条工艺路线')
|
}
|
} else {
|
this.$message.error('请先选择工艺路线')
|
}
|
},
|
calcTech() {
|
if (this.multipleSelection != null && this.multipleSelection.length > 0) {
|
if (this.multipleSelection.length <= 15) {
|
this.preCalcLoading = true
|
const ids = []
|
this.multipleSelection.forEach((item) => {
|
ids.push(item.id)
|
})
|
routingIfsCal(ids)
|
.then((response) => {
|
const resData = response.data
|
if (resData.code === 0) {
|
this.$message.success('提前计算成功')
|
this.getData()
|
} else {
|
this.$message.error('提前计算失败')
|
}
|
this.preCalcLoading = false
|
})
|
.catch(() => {
|
this.preCalcLoading = false
|
})
|
} else {
|
this.$message.error('最多可同时计算15条工艺路线')
|
}
|
} else {
|
this.$message.error('请先选择工艺路线')
|
}
|
}
|
}
|
}
|
</script>
|