<template> <section> <!--工具条--> <el-form :inline="true" :model="filters"> <el-col :span="24" class="toolbar" style="padding-bottom: 0px;"> <el-form-item> <el-input v-model="filters.roleName" placeholder="客户名称" clearable> <template slot="prepend">客户名称</template> </el-input> </el-form-item> <el-form-item> <div class="my-text-area"> <div class="el-input-group__prepend prepand">业务类型</div> <el-select v-model="filters.orgtype" filterable allow-create clearable default-first-option placeholder="业务类型"> <el-option v-for="item in orgtypeOption" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </div> </el-form-item> <el-form-item> <el-input v-model="filters.departmentid" placeholder="客户简码" clearable> <template slot="prepend">简  码</template> </el-input> </el-form-item> <el-form-item> <el-button type="primary" v-on:click="getRoles()" icon="el-icon-search">查  询</el-button> </el-form-item> <el-form-item> <el-button type="success" @click="handleAdd" icon="el-icon-document">新  增</el-button> </el-form-item> <el-form-item> <el-button type="danger" @click="batchRemove" :disabled="this.sels.length===0" icon="el-icon-delete">批量删除</el-button> </el-form-item> <el-form-item> <el-button type="warning" @click="toggleRowExpansion" icon="el-icon-sort" size="mini"> 全部{{ isExpansion ? "折叠" : "展开" }} </el-button> </el-form-item> </el-col> </el-form> <el-col :gutter="0" class="toolbar toobar_analysis" style="padding-top:0"> <el-col :span="7"> <div class="analysis_title">机构数量:</div> <div class="analysis_text">{{total}}</div> </el-col> <el-col :span="1"> <el-divider direction="vertical"></el-divider> </el-col> <el-col :span="7"> <div class="analysis_title">公司数量:</div> <div class="analysis_text">{{total}}</div> </el-col> <el-col :span="1"> <el-divider direction="vertical"></el-divider> </el-col> <el-col :span="8"> <div class="analysis_title">数据量共:</div> <div class="analysis_text">150</div> </el-col> </el-col> <!--列表--> <el-table :data="roles" highlight-current-row v-loading="listLoading" @selection-change="selsChange" default-expand-all ref="dataTreeList" row-key="roleId" border tooltip-effect="dark" style="border-radius: 10px 10px 0px 0px;line-height: 25px;min-height: 500px" :header-cell-style="{background:'#6F8294',color:'#FFFFFF'}" size="small" :tree-props="{children: 'children', hasChildren: 'hasChildren'}"> <el-table-column type="selection" width="55"> </el-table-column> <!--<el-table-column type="index" width="60">--> <!--</el-table-column>--> <el-table-column prop="roleId" label="ID" width="120"> </el-table-column> <el-table-column prop="roleName" label="岗位/角色名称" min-width="200" sortable> </el-table-column> <!--<el-table-column prop="departmentName" label="部门名称" min-width="200" sortable>--> <!--</el-table-column>--> <el-table-column prop="description" label="描述" min-width="160" > </el-table-column> <el-table-column prop="type" label="类型" min-width="80" sortable> </el-table-column> <el-table-column prop="businessLicense" label="工商代码" min-width="180" > </el-table-column> <el-table-column prop="orgtype" label="业务类型" min-width="150" > <template slot-scope="scope"> <el-tag type="" v-if="scope.row.orgtype==='M'">{{busnessType[scope.row.orgtype]}}</el-tag> <el-tag type="success" v-if="scope.row.orgtype==='C'">{{busnessType[scope.row.orgtype]}}</el-tag> <el-tag type="warning" v-if="scope.row.orgtype==='S'">{{busnessType[scope.row.orgtype]}}</el-tag> </template> </el-table-column> <el-table-column prop="departmentid" label="简码" min-width="150" > </el-table-column> <el-table-column label="操作" min-width="260" fixed="right"> <template slot-scope="scope"> <!-- <el-row>--> <!-- <el-button type="success" @click="handleAdd(scope.$index, scope.row)">新增下级</el-button>--> <!-- <el-button @click="setPerm(scope.$index, scope.row)">设置权限</el-button>--> <!-- </el-row>--> <el-row> <el-button @click="handleEdit(scope.$index, scope.row)">编  辑</el-button> <el-button type="danger" @click="handleDel(scope.$index, scope.row)">删  除</el-button> </el-row> </template> </el-table-column> </el-table> <!--工具条--> <el-col :span="24" class="toolbar"> <el-pagination layout="total, prev, pager, next" @current-change="handleCurrentChange" :page-size="pageSize" :total="total" style="float:right;"> </el-pagination> </el-col> <!--新增界面--> <el-dialog :title="dialogMap[dialogStatus]" :visible.sync="addFormVisible" :close-on-click-modal="false"> <el-form :model="addForm" label-width="120px" :rules="addFormRules" ref="addForm"> <el-form-item label="上级组织机构"> <span>{{addForm.parentName}}</span> </el-form-item> <el-form-item label=" " prop="type"> <el-select v-model="addForm.type" filterable allow-create default-first-option placeholder="组织机构类型"> <el-option v-for="item in companyOption" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label=" " prop="roleName"> <el-input v-model="addForm.roleName" auto-complete="off" placeholder="请输入组织机构名称:例如:公司名称"> <template slot="prepend">组织机构名称</template> </el-input> </el-form-item> <el-form-item label=" " prop="description"> <el-input v-model="addForm.description" auto-complete="off" placeholder="组织机构描述:例如:组织机构简介"> <template slot="prepend">组织机构描述</template> </el-input> </el-form-item> <el-form-item label=" " prop="businessLicense"> <el-input v-model="addForm.businessLicense" auto-complete="off" placeholder="社会信用代码或者组织机构代码"> <template slot="prepend">企业信用代码</template> </el-input> </el-form-item> <el-form-item label=" " prop="customsRegCode"> <el-input v-model="addForm.customsRegCode" auto-complete="off" placeholder="海关备案后返回的备案代码"> <template slot="prepend">海关备案代码</template> </el-input> </el-form-item> <el-form-item label=" " prop="mqcode"> <el-input v-model="addForm.mqcode" auto-complete="off" placeholder="海关通道编号"> <template slot="prepend">海关通道编号</template> </el-input> </el-form-item> <el-form-item label=" " prop="departmentid"> <el-input v-model="addForm.departmentid" auto-complete="off" placeholder="航司承运人代码,组织机构为航司时必填"> <template slot="prepend"> 承运人代码 </template> </el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click.native="addFormVisible = false">取消</el-button> <el-button type="primary" @click="dialogStatus==='create'?addSubmit():editSubmit()" :loading="addLoading" >提交</el-button> </div> </el-dialog> <!--权限设置界面--> <el-dialog title="岗位的权限设置" :visible.sync="PermFormVisible" :close-on-click-modal="false" top="5vh" > <el-row> <el-col :span="4" > <el-button type="primary" @click.native="treeMerge(false)">合并节点</el-button> </el-col> <el-col :span="4"> <el-button type="success" @click.native="treeMerge(true)">展开节点</el-button> </el-col> </el-row> <el-divider></el-divider> <el-form :model="permForm" label-width="80px" ref="permForm"> <el-tree :data="permissons" :props="treeDefaultProps" @check="clickDeal" :default-expand-all = "treeExpand" show-checkbox highlight-current check-on-click-node check-strictly node-key="permissionId" ref="tree"> </el-tree> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click.native="PermFormVisible = false">取消</el-button> <el-button type="primary" @click.native="setPermSubmit" :loading="addLoading">提交</el-button> </div> </el-dialog> </section> </template> <script> import util from '../../common/js/util' import NProgress from 'nprogress' import { getList, remove, batchRemove, edit, add, updateRolePerm } from '../../api/role_api'; import { getList as getCRMList } from '@/api/crm_api'; import { getList as getDepartmentList} from '../../api/department'; import { getList as permList } from '../../api/perm_api'; import moment from 'moment' export default { name:'Role', data() { return { filters: { roleName: '', orgtype:'', departmentid:'' }, companyOption: [ { label: "集团", value: "集团", }, { label: "公司", value: "公司" }, { label: "部门", value: "部门" }, { label: "航司", value: "航司" }, { label: "货代", value: "货代" }, { label: "货主", value: "货主" } ], treeDefaultProps: { children: 'children', label: 'name', }, treeExpand: false, departmentNameList:[], roles: [], permissons: [], permIds: [], total: 0, pageNum: 1, pageSize: 10, listLoading: false, sels: [],//列表选中列 dialogMap: { update: '编辑', create: '新增', }, dialogStatus: 'create', //新增界面是否显示 addFormVisible: false, //设置权限界面是否显示 PermFormVisible: false, addLoading: false, addFormRules: { roleName: [ { required: true, message: '请输入岗位/角色名称', trigger: 'blur' } ], type: [ { required: true, message: '请选择组织机构类型', trigger: 'blur' } ] }, //新增界面数据 addForm: { description: '', roleName: '', roleSign: 1, departmentid:'', type: '', businessLicense: '', customsRegCode: '', parentName: '', mqcode: '' }, isExpansion:true, permForm: { roleId: 1, description: '', roleName: '', roleSign: 1, permissions: [] }, busnessType: { 'M':'自身', 'C':'客户', 'S':'供应商' }, orgtypeOption:[ { label: "客户", value: "C", }, { label: "供应商", value: "S", }, { label: "自身", value: "M", } ] } }, methods: { toggleRowExpansion() { this.isExpansion = !this.isExpansion; this.toggleRowExpansionAll(this.roles, this.isExpansion); }, toggleRowExpansionAll(data, isExpansion) { data.forEach((item) => { this.$refs.dataTreeList.toggleRowExpansion(item, isExpansion); if (item.children !== undefined && item.children !== null) { this.toggleRowExpansionAll(item.children, isExpansion); } }); }, treeMerge: function (expand) { this.treeExpand = expand; for(var i=0;i<this.$refs.tree.store._getAllNodes().length;i++){ this.$refs.tree.store._getAllNodes()[i].expanded=this.treeExpand; } }, handleCurrentChange(val) { this.pageNum = val; this.getRoles(); }, //获取角色列表 getRoles() { let _this= this; this.listLoading = true; getCRMList(this.filters,this.pageNum,this.pageSize).then((res) => { this.total = res.data.data.total; this.roles = res.data.data.list; }).catch((error) => { if(null!= error.response && error.response!==undefined){ let status= error.response.status; let msg = error.response.statusText; return _this.$message.error(status+msg) }else { return _this.$message.error(error.toString()) } }).finally(()=>{ this.listLoading = false; }); }, //获取部门列表 getdepartmentNames() { this.listLoading = true; //NProgress.start(); getDepartmentList().then((res) => { this.total = res.data.total; this.departmentNameList = res.data.list; this.listLoading = false; //NProgress.done(); }).catch((error) => { this.listLoading = false; if(null!= error.response && error.response!==undefined){ let status= error.response.status; let msg = error.response.statusText; alert(status+msg); }else { alert(error); } }); }, //获取权限列表 getPermList() { let para = { pageNum: 1, pageSize: 700 }; NProgress.start(); permList(para).then((res) => { this.permissons = res.data.list; NProgress.done(); }).catch((error) => { if(null!= error.response && error.response!==undefined){ let status= error.response.status; let msg = error.response.statusText; message({ // 饿了么的消息弹窗组件 message: status+msg, type: "error" }); }else { alert(error); } }); }, //删除 handleDel: function (index, row) { this.$confirm('确认删除该记录吗?', '提示', { type: 'warning' }).then(() => { this.listLoading = true; //NProgress.start(); let para = { roleId: row.roleId }; remove(para).then((res) => { this.listLoading = false; //NProgress.done(); this.$message({ message: '删除成功', type: 'success' }); this.getRoles(); }).catch((error) => { this.listLoading = false; alert(error); }); }).catch(); }, /** * 显示编辑界面 * @param index * @param row 为这行的数据对象 */ handleEdit: function (index, row) { this.addFormVisible = true; this.dialogStatus= 'update', this.addForm = Object.assign({}, row); // this.getdepartmentNames(); }, setPerm: function (index, row) { this.PermFormVisible = true; this.getPermList(); var _this = this; this.permIds = []; this.permForm = Object.assign({}, row); let rolePerms = this.permForm.permissions; if (util.checkNull(rolePerms)){ rolePerms.forEach(function (perm,v_index,v_arr) { if(util.checkNull(perm)){ _this.permIds[v_index] = perm.permissionId; } }); } this.$nextTick(() => { //反向适配 this.$refs.tree.setCheckedKeys(this.permIds); }); }, //显示新增界面,每次点开初始化数据 handleAdd: function (index,row) { this.addFormVisible = true; this.dialogStatus= 'create'; this.addForm = { description: '', roleName: '', roleSign: 1, departmentid:'', type: '', businessLicense: '', customsRegCode: '', mqcode: '', parentid: 0, }; //如果新增下级 if(util.checkNull(row)){ //传递上级ID let parentRole = Object.assign({}, row); this.addForm.parentid = parentRole.roleId; this.addForm.parentName = parentRole.roleName; } // this.getdepartmentNames(); }, //编辑 editSubmit: function () { this.$refs.addForm.validate((valid) => { if (valid) { this.$confirm('确认提交吗?', '提示', {}).then(() => { this.addLoading = true; //NProgress.start(); let para = Object.assign({}, this.addForm); //不需要提交的 去掉,后端不好接收 para.authorities = null; para.permissions = null; para.roles = null; para.children = null; // para.birth = (!para.birth || para.birth == '') ? '' : util.formatDate.format(new Date(para.birth), 'yyyy-MM-dd'); /* 查询之后格式this.filters.column.create_start_date中日期发生变化; Wed Aug 09 2017 00:00:00 GMT+0800 (中国标准时间) 变成了 "2017-08-08T16:00:00.000Z"; 所以使用 moment 日期格式化插件将时间转换成 [ Wed Aug 09 2017 00:00:00 GMT+0800 (中国标准时间) ] 格 式; */ /*moment 安装 npm install moment --save*/ // para.creattime = moment(para.creattime).format('YYYY-MM-DD HH:mm:ss'); this.addLoading = false; edit(para).then((res) => { //NProgress.done(); this.$message({ message: '提交成功', type: 'success' }); this.$refs['addForm'].resetFields(); this.addFormVisible = false; this.getRoles(); }).catch(error => alert(error)); }); } }); }, //新增 addSubmit: function () { this.$refs.addForm.validate((valid) => { if (valid) { this.$confirm('确认提交吗?', '提示', {}).then(() => { this.addLoading = true; //NProgress.start(); let para = Object.assign({}, this.addForm); add(para).then((res) => { this.addLoading = false; //NProgress.done(); this.$message({ message: '提交成功', type: 'success' }); this.$refs['addForm'].resetFields(); this.addFormVisible = false; this.getRoles(); }).catch(error => alert(error)); }); } }); }, //设置角色提交 setPermSubmit: function () { this.$refs.permForm.validate((valid) => { if (valid) { this.$confirm('确认提交吗?', '提示', {}).then(() => { this.addLoading = true; //NProgress.start(); let role = Object.assign({}, this.permForm); let roleId = role.roleId; let permissionIds = this.$refs.tree.getCheckedKeys(); let para = {roleId,permissionIds}; updateRolePerm(para).then((res) => { this.addLoading = false; if (res.status ===200) { this.$message({ message: '提交成功', type: 'success' }); this.$refs['permForm'].resetFields(); } //NProgress.done(); this.PermFormVisible = false; this.getRoles(); }).catch(error => alert(error)) .finally(()=>{ this.addLoading = false }); }); } }); }, selsChange: function (sels) { this.sels = sels; }, //批量删除 batchRemove: function () { var ids = this.sels.map(item => item.roleId).toString(); this.$confirm('确认删除选中记录吗?', '提示', { type: 'warning' }).then(() => { this.listLoading = true; //NProgress.start(); let para = { ids: ids }; batchRemove(para).then((res) => { this.listLoading = false; //NProgress.done(); this.$message({ message: '删除成功', type: 'success' }); this.getRoles(); }); }).catch(() => { }); }, treeHandleCheckChange: function (data, checked, indeterminate) { if(checked) { this.permIds.push(data.permissionId); }else { this.permIds.splice(this.permIds.contains(data.permissionId),1); } console.log(data, checked, indeterminate); }, uniteParentSame(id,treeStatus){//当子节点全为未选中时父节点也变为未选中状态 let node = this.$refs.tree.getNode(permissionId);//获取当前节点的节点树 if (node.parent !== null && node.parent !== undefined) { let parentNode = node.parent.data;//获取当前节点的父节点树 if (parentNode != undefined){//判断父节点是否存在 for (let i = 0; i < parentNode.children.length; i++) { let checkedKeys = this.$refs.tree.getCheckedKeys(); let hafCheckedKeys = this.$refs.tree.getHalfCheckedKeys(); let selectNodes = checkedKeys.concat(hafCheckedKeys);//获取已选择树节点 let selected = selectNodes.indexOf(parentNode.children[i].permissionId); // -1当前节点的同级节点是否全部未选中 if (selected !== -1){ return; } } }else { return; } this.$refs.tree.setChecked(parentNode.permissionId, false);//修改节点为未选择 if(node.level>2){//判断是否是最上级节点 this.uniteParentSame(parentNode.permissionId,treeStatus) } }else { return; } }, // 统一处理子节点为相同的勾选状态 uniteChildSame(treeList, isSelected){ this.$refs.tree.setChecked(treeList.permissionId, isSelected); if (treeList.children !== undefined){ for (let i = 0; i < treeList.children.length; i++) { this.uniteChildSame(treeList.children[i], isSelected) } } }, // 统一处理父节点为选中 selectedParent(currentObj){ let currentNode = this.$refs.tree.getNode(currentObj); if (currentNode.parent.key !== undefined) { this.$refs.tree.setChecked(currentNode.parent, true); this.selectedParent(currentNode.parent) } }, clickDeal: function (currentObj, treeStatus){ // 用于:父子节点严格互不关联时,父节点勾选变化时通知子节点同步变化,实现单向关联。 let selected = treeStatus.checkedKeys.indexOf(currentObj.permissionId); // -1未选中 // 选中 if (selected !== -1) { // 子节点只要被选中父节点就被选中 // this.selectedParent(currentObj); // 统一处理子节点为相同的勾选状态 this.uniteChildSame(currentObj, true) } else { // 未选中 处理子节点全部未选中 if (currentObj.children !== undefined){ if (currentObj.children.length !== 0) { this.uniteChildSame(currentObj, false) } //放开时为当子节点全为未选中时父节点也变为未选中状态 注释后就是父节点不和子节点强制绑定 // this.uniteParentSame(currentObj.id,treeStatus)//当子节点全为未选中时父节点也变为未选中状态 } // else { // this.uniteParentSame(currentObj.id,treeStatus) // } } } }, mounted() { this.getRoles(); let _this = this; document.onkeydown = function (e) { let key = window.event.keyCode; if (key == 13) { _this.getRoles(); } }; this.isExpansion=true; } } </script> <style> </style> <style lang="scss"> .grid-content { height: 36px; line-height: 36px; } .toobar_analysis{ padding-top: 0; .el-col{ margin-right: 0; } .analysis_title{ color: #a6b6c6; font-size: 12px; height: 34px; line-height: 34px; } .analysis_text{ color: #5473E8; font-size: 16px; height: 16px; line-height: 16px; } .el-divider--vertical{ height:2em; } } </style> <style scoped> .my-text-area .prepand{ float: left; width:89px; height: 28px; font-size: 12px; line-height: 28px; } </style> <style> .my-text-area .el-input__inner{ min-height: 28px; height: 28px; border-bottom-left-radius: 0; border-top-left-radius: 0; } </style>