|
@@ -0,0 +1,383 @@
|
|
|
|
+<template>
|
|
|
|
+ <div id="dragBox" ref="dragBoxRef" class="u-tree-drag">
|
|
|
|
+ <!-- 左侧树 -->
|
|
|
|
+ <div id="leftTree" class="left-tree">
|
|
|
|
+ <div class="interlock-tree-container">
|
|
|
|
+ <div v-if="treeData.type != 'history'">
|
|
|
|
+ <a-button type="primary" icon="plus" style="width:12%;" @click="handleAdd" v-has="'add:tree'"/>
|
|
|
|
+ <a-input-search style="width:86%;margin-left:2%" allow-clear placeholder="请输入" @change="onChange" />
|
|
|
|
+ </div>
|
|
|
|
+ <div v-if="treeData.type == 'history'">
|
|
|
|
+ <a-input-search style="width:100%;margin-left:2%" allow-clear placeholder="请输入" @change="onChange" />
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="interlock-tree-content">
|
|
|
|
+ <a-tree
|
|
|
|
+ :expanded-keys="expandedKeys"
|
|
|
|
+ auto-expand-parent
|
|
|
|
+ :tree-data="tpmTreeData"
|
|
|
|
+ @expand="onExpand"
|
|
|
|
+ :replace-fields="replaceFields"
|
|
|
|
+ @select="selectNode"
|
|
|
|
+ blockNode
|
|
|
|
+ >
|
|
|
|
+ <template v-slot:title="nodeData">
|
|
|
|
+ <div class="item-node-container">
|
|
|
|
+ <div>
|
|
|
|
+ <a-icon slot="icon" type="carry-out" />
|
|
|
|
+ <span class="item-node-name">{{nodeData.interlockName}}</span>
|
|
|
|
+ </div>
|
|
|
|
+ <div v-if="treeData.type != 'history'" v-has="'edit:tree'">
|
|
|
|
+ <a-dropdown>
|
|
|
|
+ <a-icon type="more" />
|
|
|
|
+ <a-menu slot="overlay">
|
|
|
|
+ <a-menu-item>
|
|
|
|
+ <a @click="handleEdit(nodeData)">修改</a>
|
|
|
|
+ </a-menu-item>
|
|
|
|
+ <a-menu-item>
|
|
|
|
+ <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(nodeData.id)">
|
|
|
|
+ <a>删除</a>
|
|
|
|
+ </a-popconfirm>
|
|
|
|
+ </a-menu-item>
|
|
|
|
+ </a-menu>
|
|
|
|
+ </a-dropdown>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ <!-- :filter-tree-node="filterTreeNode" -->
|
|
|
|
+ </a-tree>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <!-- 拖拽盒子 -->
|
|
|
|
+ <div class="resize" id="resize" title="收缩侧边栏">⋮</div>
|
|
|
|
+ <!-- 右侧slot -->
|
|
|
|
+ <div id="rightSlot" class="right-content">
|
|
|
|
+ <slot></slot>
|
|
|
|
+ </div>
|
|
|
|
+ <!-- 新增修改弹框 -->
|
|
|
|
+ <base-InterLock-modal ref="modalForm" @ok="modalFormOk"></base-InterLock-modal>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script>
|
|
|
|
+ import { getAction,deleteAction } from '@api/manage'
|
|
|
|
+ import BaseInterLockModal from '@/views/module_interLock/baseInterLock/modules/BaseInterLockModal.vue'
|
|
|
|
+ export default({
|
|
|
|
+ name: 'UEquipmentTree',
|
|
|
|
+ components: {
|
|
|
|
+ BaseInterLockModal
|
|
|
|
+ },
|
|
|
|
+ props: {
|
|
|
|
+ treeData: {
|
|
|
|
+ type: Object,
|
|
|
|
+ default: function(){
|
|
|
|
+ return {} // 使用工厂函数返回默认值
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ data () {
|
|
|
|
+ return {
|
|
|
|
+ expandedKeys: [],
|
|
|
|
+ searchValue: '',
|
|
|
|
+ autoExpandParent: true,
|
|
|
|
+ tpmListData: [], // 原始数据
|
|
|
|
+ tpmTreeData: [], // 树形列表使用数据
|
|
|
|
+ replaceFields: {
|
|
|
|
+ children: 'children',
|
|
|
|
+ title: 'interlockName',
|
|
|
|
+ },
|
|
|
|
+ url: {
|
|
|
|
+ delete: "/base/interlockBase/delete",
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ created() {
|
|
|
|
+ this.getTpmTreeData()
|
|
|
|
+ },
|
|
|
|
+ mounted() {
|
|
|
|
+ this.dragControllerDiv()
|
|
|
|
+ },
|
|
|
|
+ methods: {
|
|
|
|
+ getTpmTreeData(){
|
|
|
|
+ // 现版本
|
|
|
|
+ // getAction(`/base/interlockBase/lever12`).then(res=>{
|
|
|
|
+ // 原版本
|
|
|
|
+ getAction(`/base/interlockBase/list`).then(res=>{
|
|
|
|
+ // if (res.success) {
|
|
|
|
+ console.log('11111',res)
|
|
|
|
+ // 防止res.result对tpmListData造成地址赋值的问题
|
|
|
|
+ this.tpmListData = JSON.parse(JSON.stringify(res))
|
|
|
|
+ // 现版本
|
|
|
|
+ // this.tpmTreeData = this.tpmListData
|
|
|
|
+ // 原版本
|
|
|
|
+ this.tpmTreeData = this.handleTree(res, "id", "pid")
|
|
|
|
+ console.log(this.tpmTreeData)
|
|
|
|
+ // } else {
|
|
|
|
+
|
|
|
|
+ // }
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ filterTreeNode(node) {
|
|
|
|
+ // console.log(node)
|
|
|
|
+ // if (!inputValue) return true;
|
|
|
|
+ return node.title.indexOf('设备') !== -1;
|
|
|
|
+ },
|
|
|
|
+ onExpand(expandedKeys) {
|
|
|
|
+ this.expandedKeys = expandedKeys;
|
|
|
|
+ this.autoExpandParent = false;
|
|
|
|
+ },
|
|
|
|
+ onChange(e) {
|
|
|
|
+ const value = e.target.value;
|
|
|
|
+ // 筛选后数据
|
|
|
|
+ var filterData = []
|
|
|
|
+ // 筛选符合条件的数据:包含当前搜索的项
|
|
|
|
+ console.log('原数据',this.tpmListData)
|
|
|
|
+ filterData = this.tpmListData.filter(item => (item.interlockName.indexOf(value) !== -1))
|
|
|
|
+ // var data = []
|
|
|
|
+ // filterData.forEach(item => {
|
|
|
|
+ // var arr = this.tpmListData.filter(data => item.pid === data.id)
|
|
|
|
+ // console.log('父级', arr)
|
|
|
|
+ // // filterData = [...filterData, ...arr]
|
|
|
|
+ // })
|
|
|
|
+ // 循环寻找父级
|
|
|
|
+ // console.log(this.findParents(this.tpmTreeData, '287813167808513'))
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // 原版本
|
|
|
|
+ this.tpmTreeData = this.handleTree(filterData, "id", "pid")
|
|
|
|
+ // 现版本
|
|
|
|
+ // this.tpmTreeData = filterData
|
|
|
|
+ // const expandedKeys = dataList.map(item => {
|
|
|
|
+ // if (item.name.indexOf(value) > -1) {
|
|
|
|
+ // // return getParentKey(item.key, gData);
|
|
|
|
+ // return this.filterNode(item.key, gData);
|
|
|
|
+ // }
|
|
|
|
+ // return null;
|
|
|
|
+ // }).filter((item, i, self) => item && self.indexOf(item) === i);
|
|
|
|
+ // Object.assign(this, {
|
|
|
|
+ // expandedKeys,
|
|
|
|
+ // searchValue: value,
|
|
|
|
+ // autoExpandParent: true,
|
|
|
|
+ // });
|
|
|
|
+ },
|
|
|
|
+ // findParents(treeData,id){
|
|
|
|
+ // let allparents = []
|
|
|
|
+ // if(treeData.length==0){
|
|
|
|
+ // return
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // let findele = (data,id) => {
|
|
|
|
+ // if(!id) return
|
|
|
|
+ // data.forEach((item,index) => {
|
|
|
|
+ // if(item.id == id){
|
|
|
|
+ // allparents.unshift(item.id)
|
|
|
|
+ // findele(treeData,item.parentid)
|
|
|
|
+
|
|
|
|
+ // }else{
|
|
|
|
+ // if(!!item.children){
|
|
|
|
+ // findele(item.children,id)
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // }
|
|
|
|
+ // })
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // findele(treeData,id)
|
|
|
|
+ // return allparents
|
|
|
|
+
|
|
|
|
+ // },
|
|
|
|
+ selectNode(selectedKeys, e){
|
|
|
|
+ this.$emit('select', selectedKeys, e)
|
|
|
|
+ },
|
|
|
|
+ handleAdd: function () {
|
|
|
|
+ this.$refs.modalForm.add();
|
|
|
|
+ this.$refs.modalForm.title = "新增";
|
|
|
|
+ this.$refs.modalForm.disableSubmit = false;
|
|
|
|
+ this.$refs.modalForm.disableEdit = false;
|
|
|
|
+ },
|
|
|
|
+ handleEdit: function (record) {
|
|
|
|
+ this.$refs.modalForm.edit(record);
|
|
|
|
+ this.$refs.modalForm.title = "编辑";
|
|
|
|
+ this.$refs.modalForm.disableSubmit = false;
|
|
|
|
+ this.$refs.modalForm.disableEdit = true;
|
|
|
|
+ },
|
|
|
|
+ handleDelete: function (id) {
|
|
|
|
+ if(!this.url.delete){
|
|
|
|
+ this.$message.error("请设置url.delete属性!")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ var that = this;
|
|
|
|
+ deleteAction(that.url.delete, {id: id}).then((res) => {
|
|
|
|
+ if (res.success) {
|
|
|
|
+ that.getTpmTreeData();
|
|
|
|
+ that.$message.success(res.message);
|
|
|
|
+ } else {
|
|
|
|
+ that.$message.warning(res.message);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ modalFormOk() {
|
|
|
|
+ // 新增/修改 成功时,重载列表
|
|
|
|
+ this.getTpmTreeData();
|
|
|
|
+ },
|
|
|
|
+ // 拖拽事件
|
|
|
|
+ dragControllerDiv(){
|
|
|
|
+ let resize = document.getElementById("resize");
|
|
|
|
+ let leftTree = document.getElementById("leftTree");
|
|
|
|
+ let rightSlot = document.getElementById("rightSlot");
|
|
|
|
+ let dragBox = document.getElementById("dragBox");
|
|
|
|
+
|
|
|
|
+ // 鼠标按下事件
|
|
|
|
+ resize.onmousedown = function (e) {
|
|
|
|
+ // 记录坐标起始位置
|
|
|
|
+ let startX = e.clientX;
|
|
|
|
+
|
|
|
|
+ // 左边元素起始宽度
|
|
|
|
+ resize.left = leftTree.offsetWidth;
|
|
|
|
+ // console.log("宽度:", resize.left);
|
|
|
|
+ // 鼠标拖动事件
|
|
|
|
+ document.onmousemove = function (e) {
|
|
|
|
+ // 鼠标拖动的终止位置
|
|
|
|
+ let endX = e.clientX;
|
|
|
|
+
|
|
|
|
+ // (endx-startx)= 移动的距离
|
|
|
|
+ // resize.left + 移动的距离 = 左边区域最后的宽度
|
|
|
|
+ let moveLen = resize.left + (endX - startX);
|
|
|
|
+ // console.log(moveLen);
|
|
|
|
+
|
|
|
|
+ // 左右两边区域的总宽度 = 大容器宽度 - 中间区域拖拉框的宽度
|
|
|
|
+ let maxWidth = dragBox.clientWidth - resize.offsetWidth;
|
|
|
|
+
|
|
|
|
+ // 限制左边区域的最小宽度为80px
|
|
|
|
+ if (moveLen < 180) moveLen = 180;
|
|
|
|
+
|
|
|
|
+ // 右边区域最小宽度为 150px 限制左边区域到150后不能再拉宽
|
|
|
|
+ if (moveLen > maxWidth - 420) moveLen = maxWidth - 420;
|
|
|
|
+
|
|
|
|
+ // 设置左边区域的宽度,通过换算为百分比的形式,实现窗体放大缩小自适应
|
|
|
|
+ // console.log((moveLen / maxWidth) * 100);
|
|
|
|
+ // leftTree.style.width =(moveLen / maxWidth * 100) + '%';
|
|
|
|
+ leftTree.style.width = moveLen + "px";
|
|
|
|
+
|
|
|
|
+ // 右边区域即是总大小 - 左边宽度 - 拖动条宽度
|
|
|
|
+ // console.log(((maxWidth - moveLen) / maxWidth) * 100);
|
|
|
|
+ rightSlot.style.width = maxWidth - moveLen + "px";
|
|
|
|
+ // console.log(moveLen);
|
|
|
|
+ };
|
|
|
|
+ // 鼠标松开事件
|
|
|
|
+ document.onmouseup = function (evt) {
|
|
|
|
+ // console.log(11);
|
|
|
|
+ document.onmousemove = null;
|
|
|
|
+ document.onmouseup = null;
|
|
|
|
+ resize.releaseCapture && resize.releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
|
|
|
|
+ };
|
|
|
|
+ resize.setCapture && resize.setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
|
|
|
|
+ return false;
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ })
|
|
|
|
+</script>
|
|
|
|
+
|
|
|
|
+<style lang="less">
|
|
|
|
+.u-tree-drag{
|
|
|
|
+ height: 100%;
|
|
|
|
+ width: 100%;
|
|
|
|
+ display: flex;
|
|
|
|
+ .left-tree{
|
|
|
|
+ height: 100%;
|
|
|
|
+ width: 20%;
|
|
|
|
+ }
|
|
|
|
+ /*拖拽区div样式*/
|
|
|
|
+ .resize {
|
|
|
|
+ cursor: col-resize;
|
|
|
|
+ float: left;
|
|
|
|
+ position: relative;
|
|
|
|
+ top: 45%;
|
|
|
|
+ background-color: #d6d6d6;
|
|
|
|
+ border-radius: 5px;
|
|
|
|
+ margin-top: -10px;
|
|
|
|
+ width: 10px;
|
|
|
|
+ height: 50px;
|
|
|
|
+ background-size: cover;
|
|
|
|
+ background-position: center;
|
|
|
|
+ /*z-index: 99999;*/
|
|
|
|
+ font-size: 32px;
|
|
|
|
+ color: white;
|
|
|
|
+ }
|
|
|
|
+ /*拖拽区鼠标悬停样式*/
|
|
|
|
+ .resize:hover {
|
|
|
|
+ color: #444444;
|
|
|
|
+ }
|
|
|
|
+ /* 右侧 */
|
|
|
|
+ .right-content{
|
|
|
|
+ height: 100%;
|
|
|
|
+ width: 80%;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+.interlock-tree-container{
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ background-color: transparent;
|
|
|
|
+ padding: 15px;
|
|
|
|
+ // border: 1px solid #CADAE6;
|
|
|
|
+ // box-shadow: 0px 5px 10px 0 #CADAE6;
|
|
|
|
+ .interlock-tree-content{
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: calc(100% - 40px);
|
|
|
|
+ overflow: auto;
|
|
|
|
+ .ant-tree{
|
|
|
|
+ li{
|
|
|
|
+ padding: 0;
|
|
|
|
+ span.ant-tree-switcher{
|
|
|
|
+ height: 40px;
|
|
|
|
+ line-height: 40px;
|
|
|
|
+ }
|
|
|
|
+ .ant-tree-node-content-wrapper{
|
|
|
|
+ height: 40px;
|
|
|
|
+ }
|
|
|
|
+ .ant-tree-node-content-wrapper:hover{
|
|
|
|
+ background: linear-gradient(315deg,rgba(11,76,217,.05) 0%,rgba(11,76,217,.05) 0%,rgba(0,140,214,.05) 100%),#ffffff;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .ant-tree-title{
|
|
|
|
+ .item-node-container{
|
|
|
|
+ width: 100%;
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ align-items: center;
|
|
|
|
+ font-size: 16px;
|
|
|
|
+ color: #323233;
|
|
|
|
+ height: 40px;
|
|
|
|
+ }
|
|
|
|
+ .item-node-name{
|
|
|
|
+ padding-left: 8px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 节点折叠时
|
|
|
|
+ .ant-tree-treenode-switcher-close{
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ // 节点打开时
|
|
|
|
+ .ant-tree-treenode-switcher-open{
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ // 节点行被选择时
|
|
|
|
+ .ant-tree-treenode-selected{
|
|
|
|
+ // 节点文字
|
|
|
|
+ .ant-tree-node-selected{
|
|
|
|
+ background: linear-gradient(to right,#a1c4fd8a 0%,#c2e9fb8a 100%)!important;
|
|
|
|
+ // background: linear-gradient(to right,#a1c4fd 0%,#c2e9fb 100%)!important;
|
|
|
|
+ // background: transparent;
|
|
|
|
+ .item-node-container{
|
|
|
|
+ // color: #008cd6;
|
|
|
|
+ // font-weight: 700;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+</style>
|