<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">简&emsp;&emsp;码</template>
					</el-input>
				</el-form-item>

				<el-form-item>
					<el-button type="primary" v-on:click="getRoles()" icon="el-icon-search">查&emsp;&emsp;询</el-button>
				</el-form-item>
				<el-form-item>
					<el-button type="success" @click="handleAdd" icon="el-icon-document">新&emsp;&emsp;增</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)">编&emsp;&emsp;辑</el-button>
						<el-button type="danger" @click="handleDel(scope.$index, scope.row)">删&emsp;&emsp;除</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"> 承运人代码&nbsp;&nbsp;&nbsp; </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>