zoukankan      html  css  js  c++  java
  • 基于图形化的组织架构设计器

    企业管理中,组织架构是最基础的数据,平时一般都是通过树形结构或列表平面化展示,但这样不够直观,领导在批准组织架构调整中,往往希望更接近组织架构图的形式展现,利用前面讲述的设计器课程思路,我设计了一个组织架构设计器:

    如上图,可以实现公司、部门、岗位、员工的设计,为了方便扩展,我把它设计成了一个JQuery插件,很容易初始化:

    <script>
        $(function(){
            $("#btn").on("click",function(){
                var url=$("#containerCanvas")[0].toDataURL();
            })
            var data={
                        data:[
                            {typeName:"公司",title:"深圳华为技术股份有限公司","abbr":"华为技术",status:1,id:"123",pid:"",reportsTo:""},
                            {typeName:"公司",title:"nonamed","abbr":"华为海思",status:1,id:"1678",pid:"",reportsTo:""},
                            {typeName:"公司",title:"子公司名1","abbr":"手机事业务",status:1,id:"def",pid:"123",ptype:"公司",reportsTo:""},
                            {typeName:"部门",title:"部门名1","abbr":"研发部",status:1,id:"abf",pid:"def",ptype:"公司",reportsTo:""},
                            {typeName:"部门",title:"部门名","abbr":"总经办",status:1,id:"abc",pid:"123",ptype:"公司",reportsTo:""},
                            {typeName:"岗位",title:"岗位名","abbr":"董事长",status:1,id:"456",pid:"abc",ptype:"部门",reportsTo:""},
                            {typeName:"岗位",title:"岗位名1","abbr":"董事",status:1,id:"455",pid:"abc",ptype:"部门",reportsTo:""},
                            {typeName:"员工",title:"员工名","abbr":"徐直军",status:1,id:"789",pid:"455",ptype:"岗位",reportsTo:""},
                            {typeName:"员工",title:"员工名2","abbr":"余承东",status:1,id:"787",pid:"455",ptype:"岗位",reportsTo:""},
                            {typeName:"员工",title:"员工名1","abbr":"任正非",createdate:"2019/06/19",status:1,id:"788",pid:"456",ptype:"岗位",reportsTo:""}
    
                        ],
                        layout:null
                    };
            $("#container").organizationDesigner({
                readonly: false,
                lineType: "折线",
                height: "500px",
                 "100%",
                title: "title",//显示标题使用的字段值。
                customTypes: {//属性页中自定义显示
                    employee: {
                        html: function (elemId, name, value, meta) { // 自定义的页面绘制元素
                            return '<span id="txtInitiator"></span>' +
                                '<button id="selectPositionIcon">选择角色</button>';
                        },
                        init: function (onchange) { //在html绘制到页上后,需绑定的事件处理
                            var onchange = onchange;
                            $("#selectPositionIcon").on("click",function () {
                                $.cfSelectPositions("selectPositionIcon", "", "", false, function (ids,names) {
                                    $("#txtInitiator").text(names);
                                    $("#txtInitiator").attr("data-value", ids);
                                    debugger;
                                    if (onchange && typeof onchange === "function")
                                        onchange("reportsTo",ids); //自定义类型时,一旦选择了数据,回调第一个参数为meta中的字段名,第二个参数为选择的值
                                });
                            })
                        },
                        valueFn: function () { return  $("#txtInitiator").attr("data-value"); } //显示时返回数据
                    }
                },
                metadata: { //在属性页中显示的可修改的数据,
                    title: { group: '数据', name: '名称' },
                    abbr: { group: '数据', name: '名称缩写' ,description:"中文名称的缩写或英文缩写"},
                    reportsTo: { group: '数据', name: 'Report to' ,type: 'employee'}
                },
                onOpen:function(callback)
                {
                    callback(data.data,data.layout)
                },
                onSave:function(content)
                {
                    data=content;
                },
                onPrint:function(url)
                {
                   $.cfDialog("图片预览","<img src=""+url+""></img>","SIZE_LARGE",[{
                        id: 'import_btn-1',
                        label: '关闭',
                        cssClass: "btn-primary",
                        action: function (dialog) {
                            dialog.close();
                        }
                    }]);
                },
                onLoad:function()
                {
                    return data;
                }
            });
        })
    </script>

    页面上定一个<div id="container">的div,重绘控件时,如果需要加载一些数据,可以在onLoad方法里返回加载的数据,保存数据在onSave里可以获得页面上的数据,并且数据状态通过status来识别1:未改变,0:新增加,2:已修改。

    也可以在onPrint获得设计画布的图片,是base64编码的DataUrl形式。

    设计器支持代码数据的查看和修改。

    属性页是自已参考easyui 的propertyGrid写的组件,支持扩展属性显示,比如显示员工的对话框等。

    这里面对数据的自动排列(刷子图标)我花了一点时间写了一个算法,感觉有点小成就 :P

    一些对齐之类的功能就很普通了。

    你可以从www.creativeflow.cn/home/demodesigner查看一下示例(IE目前不支持)。

    感谢支持,有啥问题可以给我留言。

    本文为原创,转载请注明出处。

  • 相关阅读:
    SVN
    jenkins可视化
    Tomcat
    防火墙
    keepalived
    MHA高可用
    http
    inotifywait
    DNS
    nginx
  • 原文地址:https://www.cnblogs.com/coolalam/p/11139782.html
Copyright © 2011-2022 走看看