![]()
<template>
<div class="RemoteControl">
<div class="header">远控配置-{{name}}</div>
<div style="display: flex;align-items: center; margin:10px 0">
<img style="width:14px;height:14px;margin-right: 5px;" src="@/assets/img/感叹号.png" alt="">
<span style="font-size:14px;color:#555">提示:红色标注点位数据失效,请重配置。</span>
</div>
<div class="table">
<a-card>
<a-table
:columns="columns"
:dataSource="data"
:pagination="false"
>
<template slot="plc_cname" slot-scope="text, record">
<div key="plc_cname" :class="record.status==='n' ? 'alarm': 'unAlarm'">
<!-- v-model="warnRoles" -->
<a-select
style="width: 100%; margin: -5px 0;"
v-if="record.editable"
:value="text"
v-model="plc_cname_Data"
allowClear
placeholder="请选择PLC"
@change="(e) => handleChange(siteTypeData, record.key, 'plc_cname')"
>
<a-select-option v-for="item in plcList" :key="item.id" :value="item.id">
{{ item.name }}
</a-select-option>
</a-select>
<template v-else>
<div v-show="record.plc_cname.length==0">--</div>
<div v-show="record.plc_cname.length!==0">{{ text }}</div>
</template>
</div>
</template>
<!-- 点位名称 -->
<template slot="equipment_cname" slot-scope="text, record">
<div key="equipment_cname" :class="record.status==='n' ? 'alarm': 'unAlarm'">
<a-input
v-if="record.editable"
style="margin: -5px 0;"
:value="text"
allowClear
placeholder="请输入处理时间"
@change="e => handleChange(e.target.value, record.key, 'equipment_cname')"
/>
<template v-else>
<span v-if="record.plc_cname.length==0">--</span>
<span v-if="record.plc_cname.length!==0">{{text}}</span>
</template>
</div>
</template>
<!-- 设备别名 -->
<template slot="equipment_alias" slot-scope="text, record">
<div key="equipment_alias" :class="record.status==='n' ? 'alarm': 'unAlarm'">
<a-input
v-if="record.editable"
style="margin: -5px 0;"
:value="text"
allowClear
placeholder="请输入设备别名"
@change="e => handleChange(e.target.value, record.key, 'equipment_alias')"
/>
<template v-else>
<span v-if="record.plc_cname.length==0">--</span>
<span v-if="record.plc_cname.length!==0">{{text}}</span>
</template>
</div>
</template>
<span slot="customTitle">点位名称
<a-tooltip placement="top" style=" max-width: 263px!important">
<template slot="title">
<div>点位名称:仅展示PLC设备内可读写的点</div>
</template>
<a-icon style="margin-left:5px" type="question-circle" />
</a-tooltip>
</span>
<!-- 操作 -->
<template slot="operation" slot-scope="text, record">
<template v-if="record.editable">
<span v-if="record.isNew&&!disEdit">
<a @click="saveRow(record)">添加</a>
<a-divider type="vertical" />
<a-popconfirm title="删除新增行?" @confirm="remove(record.key)">
<a>删除</a>
</a-popconfirm>
</span>
<span v-else>
<a @click="saveRow(record)">保存</a>
<a-divider type="vertical" />
<a @click="cancel(record.key)">取消</a>
</span>
</template>
<span v-else>
<a @click="toggle(record.key)" :disabled="disEdit">编辑</a>
<a-divider type="vertical" />
<a-popconfirm title="删除远控配置?" @confirm="remove(record.key)">
<a :disabled="disEdit">删除</a>
</a-popconfirm>
</span>
</template>
</a-table>
<a-button :disabled="disEdit" style="width: 100%; margin-top: 16px; margin-bottom: 8px" type="dashed" icon="plus" @click="newMember">新增</a-button>
</a-card>
</div>
</div>
</template>
<script>
import { query_remote_equipments } from '@/api/factory'
export default {
name: 'RemoteControl',
data () {
const vm = this
return {
name: vm.$route.query.cname,
loading: false,
memberLoading: false,
plc_cname_Data: undefined,
plcList: [{
id: '0',
name: 'plc'
},
{
id: '1',
name: 'plc1'
}],
// table
columns: [
{
title: 'PLC',
dataIndex: 'plc_cname',
key: 'plc_cname',
// width: '20%',
scopedSlots: { customRender: 'plc_cname' }
},
{
// title: '点位名称',
dataIndex: 'equipment_cname',
key: 'equipment_cname',
// width: '20%',
slots: { title: 'customTitle' },
scopedSlots: { customRender: 'equipment_cname' }
},
{
title: '设备别名',
dataIndex: 'equipment_alias',
key: 'equipment_alias',
// width: '40%',
scopedSlots: { customRender: 'equipment_alias' }
},
{
title: '操作',
key: 'action',
width: '9%',
scopedSlots: { customRender: 'operation' }
}
],
data: [
{
key: '1',
equipment_cname: '小明',
plc_cname: '001',
editable: false,
equipment_alias: '行政部'
},
{
key: '2',
equipment_cname: '李莉',
plc_cname: '002',
editable: false,
equipment_alias: 'IT部'
},
{
key: '3',
equipment_cname: '王小帅',
plc_cname: '003',
editable: false,
equipment_alias: '财务部'
}
],
newTabIndex: 0,
disEdit: false
}
},
mounted () {
},
methods: {
newMember () {
this.disEdit = false
const activeKey = `newKey${this.newTabIndex++}`
this.data.push({
key: activeKey,
plc_cname: '',
equipment_cname: '',
equipment_alias: '',
editable: true,
isNew: true
})
},
remove (key) {
const newData = this.data.filter(item => item.key !== key)
this.data = newData
this.disEdit = false
},
saveRow (record) {
this.disEdit = false
this.memberLoading = true
const { key, plc_cname, equipment_cname, equipment_alias } = record
if (!plc_cname || !equipment_cname || !equipment_alias) {
this.memberLoading = false
this.$message.error('请填写完整成员信息。')
return
}
// 模拟网络请求、卡顿 800ms
new Promise((resolve) => {
setTimeout(() => {
resolve({ loop: false })
}, 800)
}).then(() => {
const target = this.data.find(item => item.key === key)
target.editable = false
target.isNew = false
this.memberLoading = false
})
},
toggle (key) {
this.disEdit = true
const target = this.data.find(item => item.key === key)
target._originalData = { ...target }
target.editable = !target.editable
},
getRowByKey (key, newData) {
const data = this.data
return (newData || data).find(item => item.key === key)
},
cancel (key) {
this.disEdit = false
const target = this.data.find(item => item.key === key)
Object.keys(target).forEach(key => { target[key] = target._originalData[key] })
target._originalData = undefined
},
handleChange (value, key, column) {
const newData = [...this.data]
const target = newData.find(item => key === item.key)
if (target) {
target[column] = value
this.data = newData
}
}
},
beforeDestroy () {
}
}
</script>
<style lang="less" scoped>
.RemoteControl{
padding: 24px;
background:#fff;
.header{
font-size: 16px;
color: #000000;
padding-bottom: 20px;
border-bottom: 1px solid rgba(173, 173, 173, 0.6);
}
}
/deep/.ant-card-body{
padding: 0;
}
// /deep/.ant-tooltip-placement-top, .ant-tooltip-placement-topLeft, .ant-tooltip-placement-topRight{
// max-width: 263px!important;
// background: #fff;
// }
// .ant-tooltip-inner{
// width: 263px!important;
// }
</style>