353 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			353 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
|   | <template> | |||
|  |   <el-container> | |||
|  |     <el-dialog | |||
|  |           id="bpmOrgAddress" | |||
|  |           :title="title" | |||
|  |           :visible.sync="dialogVisible" | |||
|  |           :destroy-on-close=true | |||
|  |           :width="width" | |||
|  |           :modal-append-to-body=false | |||
|  |           :append-to-body=true | |||
|  |           :close-on-click-modal=false | |||
|  |           :before-close="handleClose"> | |||
|  |       <template v-if="refresh"> | |||
|  |         <div | |||
|  |               v-loading="loading" | |||
|  |               element-loading-text="拼命加载中"> | |||
|  | <!--          <el-autocomplete--> | |||
|  | <!--                v-model="treeSearchKey"--> | |||
|  | <!--                size="small"--> | |||
|  | <!--                :fetch-suggestions="treeSearch"--> | |||
|  | <!--                @select="treeSearchSelect"--> | |||
|  | <!--                suffix-icon="el-icon-search"--> | |||
|  | <!--                placeholder="快速查询"--> | |||
|  | <!--                :trigger-on-focus=false--> | |||
|  | <!--                style="width:100%;">--> | |||
|  | <!--            <template slot-scope="{ item }">--> | |||
|  | <!--              <el-tooltip class="item" placement="bottom">--> | |||
|  | <!--                <div slot="content">{{item.pathName}}</div>--> | |||
|  | <!--                <span>{{ item.name }}</span>--> | |||
|  | <!--              </el-tooltip>--> | |||
|  | <!--            </template>--> | |||
|  | <!--          </el-autocomplete>--> | |||
|  |           <div style="height: 300px;overflow: auto;border: 1px solid #f2f2f2;"> | |||
|  |             <div class="tree"> | |||
|  |               <el-tree | |||
|  |                     ref="tree" | |||
|  |                     :props="treeProps" | |||
|  |                     :show-checkbox="multiple" | |||
|  |                     :expand-on-click-node=false | |||
|  |                     :check-strictly=true | |||
|  |                     :highlight-current=true | |||
|  |                     @node-click="openNode" | |||
|  |                     @node-expand="expandNode" | |||
|  |                     @node-collapse="closeNode" | |||
|  |                     node-key="id" | |||
|  |                     lazy | |||
|  |                     :load="loadNode"> | |||
|  |                 <span slot-scope="{node, data}"> | |||
|  |                   <i class="awsui-iconfont tree-content-icon tree-content-icon-padding" :style="{'color': node.data.icon.color}" v-html="node.data.icon.icon"></i> | |||
|  |                   <span>{{node.label}}</span> | |||
|  |                 </span> | |||
|  |               </el-tree> | |||
|  |             </div> | |||
|  |           </div> | |||
|  |         </div> | |||
|  |       </template> | |||
|  |       <span slot="footer" class="dialog-footer"> | |||
|  |         <awsui-button class="button-general-color" type="primary" @click="submit">确定</awsui-button> | |||
|  |         <awsui-button @click="cancel">取消</awsui-button> | |||
|  |       </span> | |||
|  |     </el-dialog> | |||
|  |   </el-container> | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  |   import awsuiAxios from "../../../awsuiAxios"; | |||
|  | 
 | |||
|  |   export default { | |||
|  |     name: "BpmOrgAddress", | |||
|  |     props: { | |||
|  |       visible: { | |||
|  |         type: Boolean, | |||
|  |         default: false | |||
|  |       }, | |||
|  |       addressType: {// 地址簿类型,默认部门地址簿,可进行部门department、用户user、角色role组合,逗号分隔
 | |||
|  |         type: String, | |||
|  |         default: 'department' | |||
|  |       }, | |||
|  |       multiple: {// 是否多选
 | |||
|  |         type: Boolean, | |||
|  |         default: false | |||
|  |       }, | |||
|  |       rootDeptId: {// 默认根部门,为空则默认当前人所属单位为根节点
 | |||
|  |         type: String, | |||
|  |         default: '' | |||
|  |       }, | |||
|  |       highSecurityFilter: {// 地址簿过滤三员用户类型 三员开启模式并且地址簿类型包含用户user时有效,系统管理员sysAdmin、安全保密员secAdmin、安全审计员auditor,逗号分割
 | |||
|  |           type: String, | |||
|  |           default: ''// 例如值为sysAdmin,auditor,则开启三员之后该地址簿不显示系统管理员和安全审计员
 | |||
|  |       }, | |||
|  |       title: {// 标题
 | |||
|  |         type: String, | |||
|  |         default: '' | |||
|  |       }, | |||
|  |       selected: {// 默认选中,比如{'department':[],'user':[],'role':[],'position':[]},不区分单多选,单选只取第一个值
 | |||
|  |         type: Object, | |||
|  |         default: function () { | |||
|  |           return {'department':[],'user':[],'role':[],'position':[]} | |||
|  |         } | |||
|  |       } | |||
|  |     }, | |||
|  |     data() { | |||
|  |       return { | |||
|  |         refresh: false, | |||
|  |         dialogVisible: false, | |||
|  |         loading: false, | |||
|  |         searchKey: '', | |||
|  |         treeSearchKey: '', | |||
|  |         timeout:  null, | |||
|  |         pid: '', | |||
|  |         width: '500px', | |||
|  |         treeProps: { | |||
|  |           label: 'name', | |||
|  |           isLeaf: 'leaf' | |||
|  |         } | |||
|  |       }; | |||
|  |     }, | |||
|  |     methods: { | |||
|  |       handleClose(done) { | |||
|  |         this.closeDlalog('cancel'); | |||
|  |         done(); | |||
|  |       }, | |||
|  |       cancel() { | |||
|  |         this.closeDlalog('cancel'); | |||
|  |         this.dialogVisible = false; | |||
|  |       }, | |||
|  |       submit() { | |||
|  |         this.closeDlalog('save'); | |||
|  |         this.dialogVisible = false; | |||
|  |       }, | |||
|  |       closeDlalog(type) {// 取消/确定之后的关闭
 | |||
|  |         if (type == 'save') { | |||
|  |           let result = []; | |||
|  |           if (this.multiple) {// 多选
 | |||
|  |             result = this.$refs.tree.getCheckedNodes(); | |||
|  |           } else {// 单选
 | |||
|  |             const node = this.$refs.tree.getCurrentNode(); | |||
|  |             if (node != null) { | |||
|  |               result.push(node); | |||
|  |             } | |||
|  |           } | |||
|  |           this.$emit('getResult', JSON.parse(JSON.stringify(result))); | |||
|  |         } else { | |||
|  |           this.$emit('cancel'); | |||
|  |         } | |||
|  |         // 清空所有数据
 | |||
|  |       }, | |||
|  |       handleNodeClick(data) { | |||
|  |         // console.log(data);
 | |||
|  |       }, | |||
|  |       openNode(obj, node, tree) {// 打开一只模型文件
 | |||
|  | 
 | |||
|  |       }, | |||
|  |       treeSearchSelect(item) { | |||
|  |         this.queryTreeByIdAndPath(item.id, item.path); | |||
|  |       }, | |||
|  |       treeSearch(key, cb) { | |||
|  |         const that = this; | |||
|  |         if (key != undefined && key.trim() != '') { | |||
|  |           // that.loading = true;
 | |||
|  |           const data = { | |||
|  |             url:'jd', | |||
|  |             data:{ | |||
|  |               cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_search', | |||
|  |               addressType: that.addressType, | |||
|  |               rootDeptId: that.rootDeptId, | |||
|  |               name: key | |||
|  |             } | |||
|  |           }; | |||
|  |           // 查询数据
 | |||
|  |           awsuiAxios.post(data).then(function (ro) { | |||
|  |             if (ro.result == 'ok') { | |||
|  |               if (ro.data.length > 0) { | |||
|  |                 clearTimeout(that.timeout); | |||
|  |                 that.timeout = setTimeout(() => { | |||
|  |                   cb(ro.data); | |||
|  |                 }, 3000 * Math.random()); | |||
|  |               } else { | |||
|  |                 clearTimeout(that.timeout); | |||
|  |               } | |||
|  |             } else { | |||
|  |               clearTimeout(that.timeout); | |||
|  |             } | |||
|  |           }).catch(error=>{ | |||
|  |             console.log(error); | |||
|  |           }) | |||
|  |         } else { | |||
|  |           clearTimeout(that.timeout); | |||
|  |         } | |||
|  |       }, | |||
|  |       queryTreeByIdAndPath(id, path) {// 定位展开某节点
 | |||
|  |         const that= this; | |||
|  |         const tree = that.$refs.tree; | |||
|  |         // 分隔字符串
 | |||
|  |         const pathArr = path.split(','); | |||
|  |         let index = 1; | |||
|  |         for (let i = 0; i < pathArr.length; i++) {// 依次展开
 | |||
|  |           if (i > 0) { | |||
|  |             if (tree.getNode(pathArr[i-1]) != null) { | |||
|  |               setTimeout(that._expandNode(tree, pathArr[i-1]), index * 300); | |||
|  |               index++; | |||
|  |             } | |||
|  |           } | |||
|  |         } | |||
|  |         setTimeout(function() { | |||
|  |           if (tree.getNode(id) != null) { | |||
|  |             tree.setCurrentKey(id); | |||
|  |           } | |||
|  |         }, index * 300); | |||
|  |       }, | |||
|  |       _expandNode(tree, id) { | |||
|  |         return function() { | |||
|  |           tree.getNode(id).expand(); | |||
|  |         } | |||
|  |       }, | |||
|  |       loadNode(node, resolve) {// `动态`加载
 | |||
|  |         const that = this; | |||
|  |         that.loading = true; | |||
|  |         const data = { | |||
|  |           url:'jd', | |||
|  |           data:{ | |||
|  |             cmd: 'com.actionsoft.apps.coe.pal_bpm_org_address_component_subjson', | |||
|  |             addressType: that.addressType, | |||
|  |             pid: '', | |||
|  |             highSecurityFilter: that.highSecurityFilter | |||
|  |           } | |||
|  |         }; | |||
|  |         if (node.level === 0) { | |||
|  |           // 获取根目录
 | |||
|  |           data.data.pid = that.pid; | |||
|  |           data.data.parentType = ''; | |||
|  |         } else { | |||
|  |           // 获取其他目录
 | |||
|  |           data.data.pid = node.data.id; | |||
|  |           data.data.parentType = node.data.type; | |||
|  |         } | |||
|  |         // 查询数据
 | |||
|  |         awsuiAxios.post(data).then(function (ro) { | |||
|  |           // 设置是否可选中
 | |||
|  |           if (that.multiple) {// 多选
 | |||
|  |             const isDept = that.addressType.indexOf('department') > -1; | |||
|  |             const isUser = that.addressType.indexOf('user') > -1; | |||
|  |             const isRole = that.addressType.indexOf('role') > -1; | |||
|  |             const isPosition = that.addressType.indexOf('position') > -1; | |||
|  |             for (let i = 0; i < ro.data.length; i++) { | |||
|  |               const curr = ro.data[i]; | |||
|  |               if (curr.type == 'company' || curr.type == 'roleRoot' || curr.type == 'roleGroup' || curr.type == 'positionRoot' || curr.type == 'positionGroup') { | |||
|  |                 curr.disabled = true; | |||
|  |               } else { | |||
|  |                 if (isDept && curr.type == 'department') curr.disabled = false; | |||
|  |                 if (!isDept && curr.type == 'department') curr.disabled = true; | |||
|  |                 if (isUser && curr.type == 'user') curr.disabled = false; | |||
|  |                 if (!isUser && curr.type == 'user') curr.disabled = true; | |||
|  |                 if (isRole && curr.type == 'role') curr.disabled = false; | |||
|  |                 if (!isRole && curr.type == 'role') curr.disabled = true; | |||
|  |                 if (isPosition && curr.type == 'position') curr.disabled = false; | |||
|  |                 if (!isPosition && curr.type == 'position') curr.disabled = true; | |||
|  |               } | |||
|  |             } | |||
|  |           }; | |||
|  |           resolve(ro.data); | |||
|  |           that.loading = false; | |||
|  |           if (node.level == 0 && ro.data.length > 0) { | |||
|  |             const tree = that.$refs.tree; | |||
|  |             tree.getNode(ro.data[0].id).expand(); | |||
|  |             setTimeout(function(){ | |||
|  |               const childNode = tree.getNode(ro.data[0].id).childNodes[0]; | |||
|  |               if (childNode != null) { | |||
|  |                 childNode.expand(); | |||
|  |               } | |||
|  |             }, 500); | |||
|  |           } | |||
|  |         }).catch(error=>{ | |||
|  |           console.log(error); | |||
|  |         }) | |||
|  |       }, | |||
|  |       expandNode(obj, node, tree) {// 展开节点
 | |||
|  | 
 | |||
|  |       }, | |||
|  |       closeNode(obj, node, tree) {// 关闭时清空,下次展开重新请求动态加载
 | |||
|  |         node.childNodes = []; | |||
|  |         node.loaded = false; | |||
|  |       }, | |||
|  |       refreshNode(id) {// 刷新当前选中节点的子节点,即关闭当前节点后重新打开,会执行loadNode进行自动加载
 | |||
|  |         if (id == undefined) {// 未指定节点,默认刷新当前选中
 | |||
|  |           const nodeData = this.$refs.tree.getCurrentNode(); | |||
|  |           if (nodeData != null) { | |||
|  |             if (this.$refs.tree.store.nodesMap[nodeData.id] != undefined) { | |||
|  |               this.$refs.tree.store.nodesMap[nodeData.id].expanded = false; | |||
|  |             } | |||
|  |             const node = this.$refs.tree.getNode(nodeData.id); | |||
|  |             this.closeNode(null, node, null); | |||
|  |             node.expand(); | |||
|  |           } | |||
|  |         } else {// 指定刷新某节点
 | |||
|  |           if (this.$refs.tree.store.nodesMap[id] != undefined) { | |||
|  |             this.$refs.tree.store.nodesMap[id].expanded = false; | |||
|  |           } | |||
|  |           const node = this.$refs.tree.getNode(id); | |||
|  |           if (node != null) { | |||
|  |             this.closeNode(null, node, null); | |||
|  |             node.expand(); | |||
|  |           } | |||
|  |         } | |||
|  |       } | |||
|  |     }, | |||
|  |     watch: { | |||
|  |       visible(val) { | |||
|  |         this.dialogVisible = val; | |||
|  |         if (val) {// 打开
 | |||
|  |           if (this.addressType.indexOf('department') > 0) { | |||
|  |             this.pid = this.rootDeptId; | |||
|  |           } | |||
|  |           this.refresh = true; | |||
|  |         } else {// 关闭
 | |||
|  |           this.refresh = false; | |||
|  |         } | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  | </script> | |||
|  | 
 | |||
|  | <style scoped> | |||
|  |   #bpmOrgAddress >>> .el-dialog__body { | |||
|  |     padding: 10px 20px; | |||
|  |     color: #606266; | |||
|  |     font-size: 14px; | |||
|  |     word-break: break-all; | |||
|  |   } | |||
|  |   #bpmOrgAddress >>> .el-input__inner { | |||
|  |     border-radius: 0px; | |||
|  |   } | |||
|  |   #bpmOrgAddress >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content { | |||
|  |     background-color: #F5F7FA; | |||
|  |     color: #4E7FF9; | |||
|  |   } | |||
|  |   #bpmOrgAddress >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content .awsui-iconfont { | |||
|  |     color: #4E7FF9 !important; | |||
|  |   } | |||
|  |   /*#bpmOrgAddress >>> .el-tree .el-tree-node>.el-tree-node__children{*/ | |||
|  |   /*  overflow: visible;*/ | |||
|  |   /*}*/ | |||
|  |   .tree{ | |||
|  |     overflow: auto; | |||
|  |     width:458px; | |||
|  |     height: 300px; | |||
|  |   } | |||
|  |   #bpmOrgAddress >>> .el-tree { | |||
|  |     min-width: 100%; | |||
|  |     display:inline-block !important; | |||
|  |   } | |||
|  | </style> |