myflow.js

来源:互联网 发布:淘宝店铺行业排名下跌 编辑:程序博客网 时间:2024/05/24 03:23

(function(b){    var a = {};        a.arrNode = {};// "zengwenfeng";// 保存界面节点    a.arrLine = {};// "zwf01"; // 保存界面连线    a.curNode = {};    a.curId = "";        a.config =     {        editable:true,        lineHeight:15,        basePath:"",        arr1:[],        rect:        {            attr:            {x:10,y:10,width:100,height:50,r:5,fill:"90-#fff-#C0C0C0",stroke:"#000","stroke-width":1            },                        showType:"image&text",            type:"state",                        name:            {                text:"state",                "font-style":"italic"            },                        text:            {                text:"状态",                "font-size":13            },                        margin:5,            props:[],            img:{}        },                path:        {            attr:            {                path:                {                    path:"M10 10L100 100",                    stroke:"#808080",                    fill:"none",                    "stroke-width":2                },                                arrow:                {                    path:"M10 10L10 10",                    stroke:"#808080",                    fill:"#808080",                    "stroke-width":2,                    radius:4                },                                fromDot:                {                    width:5,                    height:5,                    stroke:"#fff",                    fill:"#000",                    cursor:"move",                    "stroke-width":2                },                                toDot:                {                    width:5,                    height:5,                    stroke:"#fff",                    fill:"#000",                    cursor:"move",                    "stroke-width":2                },                                bigDot:                {                    width:5,                    height:5,                    stroke:"#fff",                    fill:"#000",                    cursor:"move",                    "stroke-width":2                },                                smallDot:                {                    width:5,                    height:5,                    stroke:"#fff",                    fill:"#000",                    cursor:"move",                    "stroke-width":3                }            },                        text:            {                text:"TO {to}",                cursor:"move",                background:"#000"            },                        textPos:            {                x:0,                y:-10            },                        props:            {                text:                {                    name:"text",                    label:"显示",                    value:"",                    editor:function()                     {                        return new a.editors.textEditor();                    }                }            }        },                tools:        {            attr:            {                left:10,                top:10            },            pointer:{},            path:{},            states:{},            save:            {                onclick:function(c)                 {                    alert(c);                }            }        },                props:        {            attr:            {                top:10,                right:30            },                        props:{}        },                restore:"",        activeRects:        {            rects:[],            rectAttr:            {                stroke:"#ff0000",                "stroke-width":2            }        },                historyRects:        {            rects:[],            pathAttr:            {                path:                {                    stroke:"#00ff00"                },                                arrow:                {                    stroke:"#00ff00",                    fill:"#00ff00"                }            }        }    };        a.util =    {    isLine:function(g, f, e)         {            var d, c;                        if ((g.x - e.x) == 0)             {                d = 1;            }            else             {                d = (g.y - e.y) / (g.x - e.x);            }                        c = (f.x - e.x) * d + e.y;                        if ((f.y - c) < 10 && (f.y - c) > -10)            {                f.y = c;                return true;            }                        return false;        },                center:function(d, c)         {        var x1 = 0;        var y1 = 0;                x1 = (d.x - c.x) / 2 + c.x;        y1 = (d.y - c.y) / 2 + c.y;                var o = new Object();        o.x = x1;        o.y = y1;                    return o;        },                nextId:(function()         {            var c = 0;            return function()            {                return ++c;            };        })(),                // 点连线方法        connPoint:function(j, d)        {            var c = d,            e =             {                x:j.x + j.width / 2,                y:j.y + j.height / 2            };                        var l = (e.y - c.y) / (e.x - c.x);            l = isNaN(l) ? 0 :l;                        var k = j.height / j.width;            var h = c.y < e.y ? -1 :1,            f = c.x < e.x ? -1 :1,            g = 0,            i = 0;                        if (Math.abs(l) > k && h == -1)            {                g = e.y - j.height / 2;                i = e.x + h * j.height / 2 / l;            }            else            {                if (Math.abs(l) > k && h == 1)                 {                    g = e.y + j.height / 2;                    i = e.x + h * j.height / 2 / l;                }                else                 {                    if (Math.abs(l) < k && f == -1)                    {                        g = e.y + f * j.width / 2 * l;                        i = e.x - j.width / 2;                    }                    else                     {                        if (Math.abs(l) < k && f == 1)                        {                            g = e.y + j.width / 2 * l;                            i = e.x + j.width / 2;                        }                    }                }            }                        return {x:i, y:g};        },                arrow:function(l, k, d)         {            var g = Math.atan2(l.y - k.y, k.x - l.x) * (180 / Math.PI);            var h = k.x - d * Math.cos(g * (Math.PI / 180));            var f = k.y + d * Math.sin(g * (Math.PI / 180));            var e = h + d * Math.cos((g + 120) * (Math.PI / 180));            var j = f - d * Math.sin((g + 120) * (Math.PI / 180));            var c = h + d * Math.cos((g + 240) * (Math.PI / 180));            var i = f - d * Math.sin((g + 240) * (Math.PI / 180));                        return [k, {x:e, y:j}, {x:c, y:i}];        }    };        /** *  * @param p myflow.config.tools.states * @param m j{customAttributes:......} */    a.rect = function(p, m)    {        var u = this,        g = "rect" + a.util.nextId(),        E = b.extend(true, {}, a.config.rect, p),        C = m,        t,        e,        n,        f,        x = 0,        v = 0;        t = C.rect(E.attr.x, E.attr.y, E.attr.width, E.attr.height, E.attr.r).hide().attr(E.attr);        e = C.image(a.config.basePath + E.img.src, E.attr.x + E.img.width / 2, E.attr.y + (E.attr.height - E.img.height) / 2, E.img.width, E.img.height).hide();        n = C.text(E.attr.x + E.img.width + (E.attr.width - E.img.width) / 2, E.attr.y + a.config.lineHeight / 2, E.name.text).hide().attr(E.name);        f = C.text(E.attr.x + E.img.width + (E.attr.width - E.img.width) / 2, E.attr.y + (E.attr.height - a.config.lineHeight) / 2 + a.config.lineHeight, E.text.text).hide().attr(E.text);                //        t.drag(        function(r, o)        {            A(r, o);        },                function()        {            z();        },                function()        {            l();        });                //        e.drag(        function(r, o)         {            A(r, o);        },                function() {            z();        },                function() {            l();        });                //        n.drag(        function(r, o)        {            A(r, o);        },                function()        {            z();        },                function()        {            l();        });                //        f.drag(        function(r, o)         {            A(r, o);        },                function() {            z();        },                function() {            l();        });                //        var A = function(F, r)        {            if (!a.config.editable)             {                return;            }                        var o = (x + F);            var G = (v + r);            q.x = o - E.margin;            q.y = G - E.margin;                        B();        };                //        var z = function()        {            x = t.attr("x");            v = t.attr("y");            t.attr({opacity:0.5});// 透明度            e.attr({opacity:0.5});            f.attr({opacity:0.5});        };                //        var l = function()        {            t.attr({opacity:1});// 透明度            e.attr({opacity:1});            f.attr({opacity:1});        };                var s, i = {},        h = 5,        q =         {            x:E.attr.x - E.margin,            y:E.attr.y - E.margin,            width:E.attr.width + E.margin * 2,            height:E.attr.height + E.margin * 2        };                s = C.path("M0 0L1 1").hide();                //        i.t = C.rect(0, 0, h, h).attr({fill:"#000", stroke:"#fff", cursor:"s-resize"}).hide().drag(        function(r, o)        {            D(r, o, "t");        },                function()        {            k(this.attr("x") + h / 2, this.attr("y") + h / 2, "t");        },                function() {});                //        i.lt = C.rect(0, 0, h, h).attr({fill:"#000", stroke:"#fff", cursor:"nw-resize"}).hide().drag(        function(r, o)        {            D(r, o, "lt");        },                function()        {            k(this.attr("x") + h / 2, this.attr("y") + h / 2, "lt");        },                function() {});                //        i.l = C.rect(0, 0, h, h).attr({fill:"#000", stroke:"#fff", cursor:"w-resize"}).hide().drag(        function(r, o)         {            D(r, o, "l");        },                function()         {            k(this.attr("x") + h / 2, this.attr("y") + h / 2, "l");        },                function() {});                //        i.lb = C.rect(0, 0, h, h).attr({fill:"#000", stroke:"#fff", cursor:"sw-resize" }).hide().drag(        function(r, o)         {            D(r, o, "lb");        },                function()         {            k(this.attr("x") + h / 2, this.attr("y") + h / 2, "lb");        },                function() {});                //        i.b = C.rect(0, 0, h, h).attr({fill:"#000", stroke:"#fff", cursor:"s-resize"}).hide().drag(        function(r, o)        {            D(r, o, "b");        },                function()        {            k(this.attr("x") + h / 2, this.attr("y") + h / 2, "b");        },                function() {});                //        i.rb = C.rect(0, 0, h, h).attr({fill:"#000", stroke:"#fff", cursor:"se-resize"}).hide().drag(        function(r, o)        {            D(r, o, "rb");        },                function()         {            k(this.attr("x") + h / 2, this.attr("y") + h / 2, "rb");        },                function() {});                //        i.r = C.rect(0, 0, h, h).attr({fill:"#000", stroke:"#fff", cursor:"w-resize"}).hide().drag(        function(r, o)        {            D(r, o, "r");        },                function()        {            k(this.attr("x") + h / 2, this.attr("y") + h / 2, "r");        },                function() {});                //        i.rt = C.rect(0, 0, h, h).attr({fill:"#000", stroke:"#fff", cursor:"ne-resize"}).hide().drag(        function(r, o)        {            D(r, o, "rt");        },                function()        {            k(this.attr("x") + h / 2, this.attr("y") + h / 2, "rt");        },                function() {});                //        var D = function(F, r, G)        {            if (!a.config.editable)            {                return;            }                        var o = _bx + F,            H = _by + r;            switch (G)            {            case "t":                q.height += q.y - H;                q.y = H;                break;                            case "lt":                q.width += q.x - o;                q.height += q.y - H;                q.x = o;                q.y = H;                break;                            case "l":                q.width += q.x - o;                q.x = o;                break;                            case "lb":                q.height = H - q.y;                q.width += q.x - o;                q.x = o;                break;                            case "b":                q.height = H - q.y;                break;                            case "rb":                q.height = H - q.y;                q.width = o - q.x;                break;                            case "r":                q.width = o - q.x;                break;                            case "rt":                q.width = o - q.x;                q.height += q.y - H;                q.y = H;                break;            }                        B();        };                var k = function(r, o, F)        {            _bx = r;            _by = o;        };                b([t.node, f.node, n.node, e.node]).bind("click",        function()         {            if (!a.config.editable)             {                return;            }                    w();                        // 获取模式,是点,还是要做连线            var o = b(C).data("mod");                        switch (o)            {            case "pointer":                break;            case "path":            // 获取前面保存的节点                var nodeFrom = b(C).data("curNode");                                if (nodeFrom && nodeFrom.getId() != g && nodeFrom.getId().substring(0, 4) == "rect")                 {                // 起点                var nodeFromId = nodeFrom.getId();                var nodeFromType = nodeFrom.getType();                                // 终点                var nodeToId = u.getId();                var nodeToType = u.getType();                                // 所有线段                var arrLine = a.arrLine;//zwf                var cnt = 0;                // 开始节点有且只能做一次起点                if (nodeFromType == "start")                {                cnt = getCntInLines(nodeFromId, arrLine, "from");                if (cnt > 0)                {                return;                }                }                // 结束节点不能作为起点                else if (nodeFromType == "end")                {                return;                }                // 分支节点可以做多次的起点,不计算                else if (nodeFromType == "fork")                {                ;                }                // 合并节点有且只能做一次起点                else if (nodeFromType == "join")                {                cnt = getCntInLines(nodeFromId, arrLine, "from");                if (cnt > 0)                {                return;                }                }                // 其他节点有且只能做一次起点                else                {                cnt = getCntInLines(nodeFromId, arrLine, "from");                if (cnt > 0)                {                return;                }                }                                //--------------------------------------------------------                // 开始节点不能做终点                if (nodeToType == "start")                {                return;                }                // 结束节点只能做一次终点                else if (nodeToType == "end")                {                cnt = getCntInLines(nodeToId, arrLine, "to");                if (cnt > 0)                {                return;                }                }                // 分支节点可以做多次的起点,不计算                else if (nodeToType == "fork")                {                cnt = getCntInLines(nodeToId, arrLine, "to");                if (cnt > 0)                {                return;                }                }                // 合并节点有且只能做一次起点                else if (nodeToType == "join")                {                ;                }                // 其他节点有且只能做一次起点                else                {                cnt = getCntInLines(nodeToId, arrLine, "to");                if (cnt > 0)                {                return;                }                }                                // 触发添加连线事件                    b(C).trigger("addpath", [nodeFrom, u]);                                        //                $("#path").removeClass("selected");                $("#pointer").addClass("selected");                b(C).data("mod", "pointer");                }                                break;            }                        b(C).trigger("click", u);                        b(C).data("curNode", u);            a.curNode = u; // zengwenfeng,绑定            a.curId = u.getId();                        // 获取当前节点            var _curNode = b(C).data("curNode");            if (_curNode)            {            // 当前节点是开始或者结束节点,不显示属性对话框            if (_curNode.getId().substring(0, 4) == "rect" && (_curNode.getType() == "start" || _curNode.getType() == "end"))            {            $("#myflow_props").hide();            }            // 其他节点显示            else            {            $("#myflow_props").show();            }            }                        // 显示 属性对话框//          $("#myflow_props").show();                        // 移除 属性扩展对话框        $("#myflow_props_detail").remove();                    //            return false;        });                var j = function(o, r)         {            if (!a.config.editable)             {                return;            }                    if (r.getId() == g)            {                b(C).trigger("showprops", [E.props, r]);            }            else            {                d();            }        };        b(C).bind("click", j);                //        var c = function(o, F, r)        {            if (r.getId() == g)             {                f.attr({text:F});            }        };        b(C).bind("textchange", c);                function y()         {            return "M" + q.x + " " + q.y + "L" + q.x + " " + (q.y + q.height) + "L" + (q.x + q.width) + " " + (q.y + q.height) + "L" + (q.x + q.width) + " " + q.y + "L" + q.x + " " + q.y;        }                function w()         {            s.show();                        for (var o in i)             {                i[o].show();            }        }                function d()         {        s.hide();                for (var o in i)        {                i[o].hide();            }        }                function B()        {            var F = q.x + E.margin,            r = q.y + E.margin,            G = q.width - E.margin * 2,            o = q.height - E.margin * 2;                        t.attr({x:F, y:r, width:G, height:o});//显示边框                        switch (E.showType)             {            case "image":                e.attr({x:F + (G - E.img.width) / 2, y:r + (o - E.img.height) / 2}).show();                break;                            case "text":                t.show();                f.attr({x:F + G / 2, y:r + o / 2}).show();                break;                            case "image&text":                t.show();                e.attr({x:F + E.img.width / 2, y:r + (o - E.img.height) / 2}).show();                n.attr({x:F + E.img.width + (G - E.img.width) / 2, y:r + a.config.lineHeight / 2}).show();                f.attr({x:F + E.img.width + (G - E.img.width) / 2, y:r + (o - a.config.lineHeight) / 2 + a.config.lineHeight}).show();                break;                            case "showType04"://            e.attr({x:F + (G - E.img.width) / 2, y:r + (o - E.img.height) / 2  - a.config.lineHeight}).show();//            f.attr({x:F + G / 2, y:r + o / 2  + a.config.lineHeight}).show();            e.attr({x:F + (G - E.img.width) / 2, y:r + (o - E.img.height) / 2}).show();            f.attr({x:F + G / 2, y:r + o / 2  + a.config.lineHeight * 2}).show();                        break;            }                        i.t.attr({x:q.x + q.width / 2 - h / 2, y:q.y - h / 2});                        i.lt.attr({x:q.x - h / 2, y:q.y - h / 2});                        i.l.attr({x:q.x - h / 2, y:q.y - h / 2 + q.height / 2});                        i.lb.attr({x:q.x - h / 2, y:q.y - h / 2 + q.height});                        i.b.attr({x:q.x - h / 2 + q.width / 2, y:q.y - h / 2 + q.height});                        i.rb.attr({x:q.x - h / 2 + q.width, y:q.y - h / 2 + q.height});                        i.r.attr({x:q.x - h / 2 + q.width, y:q.y - h / 2 + q.height / 2});                        i.rt.attr({x:q.x - h / 2 + q.width, y:q.y - h / 2});                        s.attr({path:y()});                        b(C).trigger("rectresize", u);        }                this.toJson = function()         {            var r = "{type:'" + E.type + "',text:{text:'" + f.attr("text") + "'}, attr:{ x:" + Math.round(t.attr("x")) + ", y:" + Math.round(t.attr("y")) + ", width:" + Math.round(t.attr("width")) + ", height:" + Math.round(t.attr("height")) + "}, props:{";                        for (var o in E.props)             {                r += o + ":{value:'" + E.props[o].value + "'},";            }                        if (r.substring(r.length - 1, r.length) == ",")             {                r = r.substring(0, r.length - 1);            }                        r += "}}";                        return r;        };                this.restore = function(o)         {            var r = o;            E = b.extend(true, E, o);            f.attr({text:r.text.text});                        B();        };                // 获取 节点控件 x、y、weight、height        this.getBBox = function()         {            return q;        };                // 获取 节点 控件 类型, 例如:myflow.jpdl5.js文件中定义节点的类型 task、fork、start、end        this.getType = function()        {        return E.type;        };                // 获取 节点 id        this.getId = function()        {            return g;        };                this.remove = function()         {            t.remove();            f.remove();            n.remove();            e.remove();            s.remove();                        for (var o in i)             {                i[o].remove();            }        };                this.text = function()         {            return f.attr("text");        };                this.attr = function(o)         {            if (o)             {                t.attr(o);            }        };                B();    };        a.path = function(q, n, u, e)    {    var v = this,        z = n,        B = b.extend(true, {}, a.config.path),        i,        t,        f,        h = B.textPos,        y=0,        w=0,        k = u,        s = e,                //线段的ID        g = "path" + a.util.nextId(),        x;            function p(G, H, D, L)        {            var F = this,            M = G,            r=0, o = D,            O = L,            K=0, I=0, N = H;                        switch (M)            {            case "from":                r = z.rect(H.x - B.attr.fromDot.width / 2, H.y - B.attr.fromDot.height / 2, B.attr.fromDot.width, B.attr.fromDot.height).attr(B.attr.fromDot);                break;                            case "big":                r = z.rect(H.x - B.attr.bigDot.width / 2, H.y - B.attr.bigDot.height / 2, B.attr.bigDot.width, B.attr.bigDot.height).attr(B.attr.bigDot);                break;                            case "small":                r = z.rect(H.x - B.attr.smallDot.width / 2, H.y - B.attr.smallDot.height / 2, B.attr.smallDot.width, B.attr.smallDot.height).attr(B.attr.smallDot);                break;                            case "to":                r = z.rect(H.x - B.attr.toDot.width / 2, H.y - B.attr.toDot.height / 2, B.attr.toDot.width, B.attr.toDot.height).attr(B.attr.toDot);                break;            }                        if (r && (M == "big" || M == "small"))            {                r.drag(                function(Q, P)                {                    C(Q, P);                },                                function()                {                    J();                },                                function()                {                    E();                });                                var C = function(R, Q)                {                    var P = (K + R),                    S = (I + Q);                    F.moveTo(P, S);                };                                var J = function()                {                    if (M == "big")                    {                        K = r.attr("x") + B.attr.bigDot.width / 2;                        I = r.attr("y") + B.attr.bigDot.height / 2;                    }                                        if (M == "small")                    {                        K = r.attr("x") + B.attr.smallDot.width / 2;                        I = r.attr("y") + B.attr.smallDot.height / 2;                    }                };                                var E = function() {};            }                        this.type = function(P)            {                if (P)                 {                    M = P;                }                else                {                    return M;                }            };                        this.node = function(P)            {                if (P)                 {                r = P;                }                else                {                    return r;                }            };                        this.left = function(P)            {                if (P)                {                    o = P;                }                else                {                    return o;                }            };                        this.right = function(P)            {                if (P)                {                    O = P;                }                else                {                    return O;                }            };                        this.remove = function()             {                o = null;                O = null;                r.remove();            };                        this.pos = function(P)             {                if (P)                {                    N = P;                    r.attr({x:N.x - r.attr("width") / 2, y:N.y - r.attr("height") / 2});                                        return this;                }                else                {                    return N;                }            };                        this.moveTo = function(Q, T)            {                this.pos({x:Q, y:T});                switch (M)                 {                case "from":                    if (O && O.right() && O.right().type() == "to")                     {                        O.right().pos(a.util.connPoint(s.getBBox(), N));                    }                                        if (O && O.right())                    {                        O.pos(a.util.center(N, O.right().pos()));                    }                                        break;                case "big":                    if (O && O.right() && O.right().type() == "to")                     {                        O.right().pos(a.util.connPoint(s.getBBox(), N));                    }                                        if (o && o.left() && o.left().type() == "from")                     {                        o.left().pos(a.util.connPoint(k.getBBox(), N));                    }                                        if (O && O.right())                     {                        O.pos(a.util.center(N, O.right().pos()));                    }                                        if (o && o.left())                     {                        o.pos(a.util.center(N, o.left().pos()));                    }                                        var S = {x:N.x, y:N.y};                                        if (a.util.isLine(o.left().pos(), S, O.right().pos()))                    {                        M = "small";                        r.attr(B.attr.smallDot);                        this.pos(S);                        var P = o;                        o.left().right(o.right());                        o = o.left();                        P.remove();                        var R = O;                        O.right().left(O.left());                        O = O.right();                        R.remove();                    }                                        break;                                    case "small":                    if (o && O && !a.util.isLine(o.pos(), {x:N.x, y:N.y}, O.pos()))                     {                        M = "big";                        r.attr(B.attr.bigDot);                        var P = new p("small", a.util.center(o.pos(), N), o, o.right());                        o.right(P);                        o = P;                        var R = new p("small", a.util.center(O.pos(), N), O.left(), O);                        O.left(R);                        O = R;                    }                                        break;                                    case "to":                    if (o && o.left() && o.left().type() == "from")                    {                        o.left().pos(a.util.connPoint(k.getBBox(), N));                    }                                        if (o && o.left())                    {                        o.pos(a.util.center(N, o.left().pos()));                    }                                        break;                }                                m();            };        }            function j()        {            var D, C, E = k.getBBox(),            F = s.getBBox(),            r,            o;            r = a.util.connPoint(E, {x:F.x + F.width / 2, y:F.y + F.height / 2});                        o = a.util.connPoint(F, r);                        D = new p("from", r, null, new p("small", {x:(r.x + o.x) / 2, y:(r.y + o.y) / 2}));                        D.right().left(D);            C = new p("to", o, D.right(), null);            D.right().right(C);                        this.toPathString = function()            {                if (!D)                 {                    return "";                }                var J = D,                I = "M" + J.pos().x + " " + J.pos().y,                H = "";                                while (J.right())                 {                    J = J.right();                    I += "L" + J.pos().x + " " + J.pos().y;                }                                var G = a.util.arrow(J.left().pos(), J.pos(), B.attr.arrow.radius);                H = "M" + G[0].x + " " + G[0].y + "L" + G[1].x + " " + G[1].y + "L" + G[2].x + " " + G[2].y + "z";                                return [I, H];            };                        this.toJson = function()            {                var G = "[",                H = D;                while (H)                {                    if (H.type() == "big")                    {                        G += "{x:" + Math.round(H.pos().x) + ",y:" + Math.round(H.pos().y) + "},";                    }                                        H = H.right();                }                                if (G.substring(G.length - 1, G.length) == ",")                 {                    G = G.substring(0, G.length - 1);                }                                G += "]";                                return G;            };                        this.restore = function(H)            {                var I = H,                J = D.right();                                for (var G = 0; G < I.length; G++)                 {                    J.moveTo(I[G].x, I[G].y);                    J.moveTo(I[G].x, I[G].y);                    J = J.right();                }                                this.hide();            };                        this.fromDot = function()            {                return D;            };                        this.toDot = function()            {                return C;            };                        this.midDot = function()            {                var H = D.right(),                G = D.right().right();                while (G.right() && G.right().right())                {                    G = G.right().right();                    H = H.right();                }                return H;            };                        this.show = function()            {                var G = D;                while (G)                {                    G.node().show();                    G = G.right();                }            };                        this.hide = function()            {                var G = D;                while (G)                {                    G.node().hide();                    G = G.right();                }            };                        this.remove = function()             {                var G = D;                while (G)                {                    if (G.right())                    {                        G = G.right();                        G.left().remove();                    }                    else                    {                        G.remove();                        G = null;                    }                }            };        }        B = b.extend(true, B, q);        i = z.path(B.attr.path.path).attr(B.attr.path);        t = z.path(B.attr.arrow.path).attr(B.attr.arrow);        x = new j();        x.hide();                        var strToText = "";        var strFromType = k.getType();        if (strFromType == "fork")        {        strToText = s.text() + " " + s.getId();        }        else        {        strToText = s.text();        }                // 如果线段上只要显示线段ID,直接上        strToText = g;                f = z.text(0, 0, B.text.text).attr(B.text).attr({text:B.text.text.replace("{from}", k.text()).replace("{to}", strToText)});//      f = z.text(0, 0, B.text.text).attr(B.text).attr({text:B.text.text.replace("{from}", k.text()).replace("{to}", s.text())});                f.drag(function(r, o) {if (!a.config.editable) {return;}f.attr({x:y + r,y:w + o});        },                function()         {            y = f.attr("x");            w = f.attr("y");        },                function()         {            var o = x.midDot().pos();                        h = {                x:f.attr("x") - o.x,                y:f.attr("y") - o.y            };        });                m();                b([i.node, t.node]).bind("click", function()         {            if (!a.config.editable)             {                return;            }                        b(z).trigger("click", v);                                    b(z).data("curNode", v);            a.curNode = v; // zengwenfeng            a.curId = v.getId();                        return false;        });                var l = function(r, C)         {            if (!a.config.editable)             {                return;            }                        if (C && C.getId() == g)             {                x.show();                                b(z).trigger("showprops", [B.props, v]);            }            else            {                x.hide();            }                        var o = b(z).data("mod");            switch (o)             {            case "pointer":                break;            case "path":                break;            }        };        b(z).bind("click", l);                        var A = function(o, r)         {            if (!a.config.editable)            {                return;            }                        if (r && (r.getId() == k.getId() || r.getId() == s.getId()))            {                b(z).trigger("removepath", v);            }        };        b(z).bind("removerect", A);                        var d = function(C, D)         {            if (!a.config.editable)             {                return;            }                        if (k && k.getId() == D.getId())             {                var o = null;                                if (x.fromDot().right().right().type() == "to")                 {                    o =                     {                        x:s.getBBox().x + s.getBBox().width / 2,                        y:s.getBBox().y + s.getBBox().height / 2                    };                }                else                 {                    o = x.fromDot().right().right().pos();                }                                var r = a.util.connPoint(k.getBBox(), o);                                x.fromDot().moveTo(r.x, r.y);                                m();            }                        if (s && s.getId() == D.getId())            {                var o = null;                                if (x.toDot().left().left().type() == "from")                {                    o =                     {                        x:k.getBBox().x + k.getBBox().width / 2,                        y:k.getBBox().y + k.getBBox().height / 2                    };                }                else                {                    o = x.toDot().left().left().pos();                }                                var r = a.util.connPoint(s.getBBox(), o);                                x.toDot().moveTo(r.x, r.y);                                m();            }        };        b(z).bind("rectresize", d);                var c = function(r, o, C)        {            if (C.getId() == g)             {                f.attr({text:o});            }        };        b(z).bind("textchange", c);                this.from = function()         {            return k;        };                this.to = function()         {            return s;        };                this.toJson = function()         {            var r = "{from:'" + k.getId() + "',to:'" + s.getId() + "', dots:" + x.toJson() + ",text:{text:'" + f.attr("text") + "'},textPos:{x:" + Math.round(h.x) + ",y:" + Math.round(h.y) + "}, props:{";                        for (var o in B.props)             {                r += o + ":{value:'" + B.props[o].value + "'},";            }                        if (r.substring(r.length - 1, r.length) == ",")             {                r = r.substring(0, r.length - 1);            }                        r += "}}";                        return r;        };                this.restore = function(o)        {            var r = o;            B = b.extend(true, B, o);            x.restore(r.dots);        };                this.remove = function()         {            x.remove();            i.remove();            t.remove();            f.remove();                        try             {                b(z).unbind("click", l);            }            catch(o)            {                        }                        try             {                b(z).unbind("removerect", A);            }             catch(o)            {                        }                        try             {                b(z).unbind("rectresize", d);            }            catch(o)             {                        }                        try             {                b(z).unbind("textchange", c);            }            catch(o)            {                        }        };                function m()        {            var r = x.toPathString(),                        o = x.midDot().pos();                        i.attr({path:r[0]});                        t.attr({path:r[1]});                        f.attr({x:o.x + h.x, y:o.y + h.y});        }                // 获取 连线 id        this.getId = function()         {            return g;        };                this.text = function()        {            return f.attr("text");        };                this.attr = function(o)        {            if (o && o.path)             {                i.attr(o.path);            }                        if (o && o.arrow)             {                t.attr(o.arrow);            }        };    };        a.props = function(h, f)     {// var j = this;        var c = b("#myflow_props").hide().draggable({handle:"#myflow_props_handle"}).        resizable().css(a.config.props.attr).bind("click",function() {return false;});                var e = c.find("table");        var g = f;        var i = null;        var d = function(n, m, o)         {            if (i && i.getId() == o.getId())             {                return;            }                        i = o;                        b(e).find(".editor").each(function()             {                var k = b(this).data("editor");                                if (k)                 {                    k.destroy();                }            });                        e.empty();            c.show();                        for (var l in m)             {            // 属性行 zengwenfeng                e.append("<tr><th>" + m[l].label + '</th><td><div id="p' + l + '" class="editor"></div></td></tr>');                                if (m[l].editor)                 {                    m[l].editor().init(m, l, "p" + l, o, g);                }            }        };        b(g).bind("showprops", d);    };        a.editors =     {        textEditor:function()         {            var c = null;            var d = null;            var e = null;            var f = null;            var g = null;                        this.init = function(i, h, m, l, j)             {                d = i;                e = h;                c = m;                g = l;                f = j;                                //                b("<input  style='width:100%;'/>").click(function()                {                // desc:移除属性扩展控件 author:zengwenfeng date:2015.12.01                $("#myflow_props_detail").remove();                                }).val(g.text()).change(function()                {                    i[e].value = b(this).val();                    b(f).trigger("textchange", [b(this).val(), g]);                }).appendTo("#" + c);                                //                b("#" + c).data("editor", this);            };                        this.destroy = function()             {                b("#" + c + " input").each(function()                {                    d[e].value = b(this).val();                    b(f).trigger("textchange", [b(this).val(), g]);                });            };        }    };        // desc:初始化页面 author:zengwenfeng    a.init = function(x, r)     {        var v = b(window).width(),        e = b(window).height(),        y = Raphael(x, v * 1.5, e * 1.5),        q = {}, // 节点集合        g = {}; // 连线集合                b.extend(true, a.config, r);                //        b(document).keydown(function(i)         {            if (!a.config.editable)             {                return;            }                        // 键盘DEL事件            if (i.keyCode == 46)             {                var j = b(y).data("curNode");                                if (j)                 {                // 如果是节点,节点为开始或者结束,不允许删除                if (j.getId().substring(0, 4) == "rect" && (j.getType() == "start" || j.getType() == "end"))                {                return;                }                                //                    if (j.getId().substring(0, 4) == "rect")                    {                        b(y).trigger("removerect", j);                    }                    else                    {                        if (j.getId().substring(0, 4) == "path")                         {                            b(y).trigger("removepath", j);                        }                    }                                        b(y).removeData("curNode");                    a.curNode = null;// 移除绑定                    a.curId = "";                                        // 删除后,隐藏属性对话框                    $("#myflow_props").hide();                }            }        });                //页面单击事件        b(document).click(function()        {        // desc:移除属性扩展控件 author:zengwenfeng date:2015.12.01        $("#myflow_props").hide();        $("#myflow_props_detail").remove();                    //        b(y).data("curNode", null);        a.curNode = null; // zengwenfeng 移除绑定        a.curId = ""; // zengwenfeng 移除绑定                    b(y).trigger("click", {getId:function() { return "00000000";}});            //          b(y).trigger("showprops", [a.config.props.props, {getId:function() {return "00000000";}}]);        });                // 删除节点以及连线        var w = function(c, i)         {            if (!a.config.editable)             {                return;            }                        if (i.getId().substring(0, 4) == "rect")             {                q[i.getId()] = null;                                // 从界面把节点控件移除                i.remove();            }            else if (i.getId().substring(0, 4) == "path")            {            g[i.getId()] = null;                        // 从界面把连线控件移除            i.remove();            }        };        //绑定删除连线事件        b(y).bind("removepath", w);        //绑定删除节点事件        b(y).bind("removerect", w);                // 新增节点        b(y).bind("addrect", function(j, c, k)         {            var i = new a.rect(b.extend(true, {}, a.config.tools.states[c], k), y);                        q[i.getId()] = i;        });                // 新增连线        var f = function(i, nodeFrom, nodeTo)         {            var c = new a.path({}, y, nodeFrom, nodeTo);                        var kid = nodeFrom.getId();            var jid = nodeTo.getId();            var ktype = nodeFrom.getType();            var jtype = nodeTo.getType();                                    g[c.getId()] = c;        };        b(y).bind("addpath", f);                //        b(y).data("mod", "point");                if (a.config.editable)         {        //            b("#myflow_tools").draggable({handle:"#myflow_tools_handle"}).css(a.config.tools.attr);                        //            b("#myflow_tools .node").hover(        function()         {        b(this).addClass("mover");        },                function()        {        b(this).removeClass("mover");        }            );                        //            b("#myflow_tools .selectable").click(function()             {                b(".selected").removeClass("selected");                b(this).addClass("selected");                b(y).data("mod", this.id);            });                        //            b("#myflow_tools .state").each(function()             {                b(this).draggable({helper:"clone"});            });                        b(x).droppable(            {                accept:".state",                drop:function(c, i)                 {                    b(y).trigger("addrect", [i.helper.attr("type"), {                        attr:                        {                            x:i.helper.offset().left,                            y:i.helper.offset().top                        }                    }]);                }            });                        // 保存方法            b("#myflow_save").click(function()            {            var i = "{states:{";                            for (var c in q)            {            if (q[c])            {                        i += q[c].getId() + ":" + q[c].toJson() + ",";                    }                }                                if (i.substring(i.length - 1, i.length) == ",")                {                    i = i.substring(0, i.length - 1);                }                                i += "},paths:{";                                for (var c in g)                {                    if (g[c])                    {                        i += g[c].getId() + ":" + g[c].toJson() + ",";                    }                }                                if (i.substring(i.length - 1, i.length) == ",")                {                    i = i.substring(0, i.length - 1);                }                                i += "},props:{props:{";                                for (var c in a.config.props.props)                {                    i += c + ":{value:'" + a.config.props.props[c].value + "'},";                }                                if (i.substring(i.length - 1, i.length) == ",")                {                    i = i.substring(0, i.length - 1);                }                                i += "}}}";                                a.config.tools.save.onclick(i);            });                        new a.props({}, y);        }                if (r.restore)        {            var B = r.restore;            var z = {};                        if (B.states)            {                for (var s in B.states)                {                    var d = new a.rect(b.extend(true, {}, a.config.tools.states[B.states[s].type], B.states[s]), y);                    d.restore(B.states[s]);                                        z[s] = d;                                        q[d.getId()] = d;                }            }                        if (B.paths)            {                for (var s in B.paths)                {                    var n = new a.path(b.extend(true, {}, a.config.tools.path, B.paths[s]), y, z[B.paths[s].from], z[B.paths[s].to]);                    n.restore(B.paths[s]);                                        g[n.getId()] = n;                }            }        }                var A = a.config.historyRects;        var l = a.config.activeRects;                if (A.rects.length || l.rects.length)        {        var m = {};        var z = {};                        for (var h in g)            {                if (!z[g[h].from().text()])                {                    z[g[h].from().text()] = {rect:g[h].from(), paths:{}};                }                                z[g[h].from().text()].paths[g[h].text()] = g[h];                                if (!z[g[h].to().text()])                {                    z[g[h].to().text()] = {rect:g[h].to(), paths:{}};                }            }                        for (var u = 0; u < A.rects.length; u++)             {                if (z[A.rects[u].name])                {                    z[A.rects[u].name].rect.attr(A.rectAttr);                }                                for (var t = 0; t < A.rects[u].paths.length; t++)                {                    if (z[A.rects[u].name].paths[A.rects[u].paths[t]])                     {                        z[A.rects[u].name].paths[A.rects[u].paths[t]].attr(A.pathAttr);                    }                }            }                        for (var u = 0; u < l.rects.length; u++)            {                if (z[l.rects[u].name])                 {                    z[l.rects[u].name].rect.attr(l.rectAttr);                }                                for (var t = 0; t < l.rects[u].paths.length; t++)                {                    if (z[l.rects[u].name].paths[l.rects[u].paths[t]])                    {                        z[l.rects[u].name].paths[l.rects[u].paths[t]].attr(l.pathAttr);                    }                }            }        }                a.arrNode = q; // "zengwenfeng";// 保存界面节点        a.arrLine = g; // "zwf01"; // 保存界面连线    };        b.fn.myflow = function(c)     {        return this.each(function()        {            a.init(this, c);        });    };        b.myflow = a;        /** * 计算节点在线集合中作为起点的次数 *  * @author zengwenfeng * @date 2015.12.12 * @param id     当前选中节点id * @param lines  当前页面所有连线 */function getCntInLines(id, lines, flag){var cnt = 0;if (id == null || lines == null){return cnt;}// if (typeof (lines) == "object"){for (var i in lines){if (lines[i]){var nodeId = "";if (flag == "from"){nodeId = lines[i].from().getId();}else if (flag == "to"){nodeId = lines[i].to().getId();}if (nodeId == id){cnt++;}}}}return cnt;}})(jQuery);


package com.tansun.rule.ruleFlow.model;import java.io.Serializable;import javax.xml.bind.annotation.XmlRootElement;import org.eclipse.persistence.oxm.annotations.XmlCDATA;/** * 规则流 实体类 *  * @author ZengWenfeng */@XmlRootElement(name = "RuleFlowModel")public class RuleFlowModel implements Serializable{private static final long serialVersionUID = 8993578477614234706L;public final static String TYPE = "ruleFlow";public final static String XML_RULEFLOW = "ruleFlow.xml";//XML_RULEFLOWpublic final static String XML_MODEL = "model.xml";//XML_RULEFLOWpublic final static String BPMN_DATA = "data.bpmn";//public static String xml_file = RuleProject.HOMEPATH + File.separator + RuleProject.CURRPROJECTCODE + File.separator + "ruleFlow" + File.separator + "ruleFlow.xml";//public static String xml_path = RuleProject.HOMEPATH + File.separator + RuleProject.CURRPROJECTCODE + File.separator + "ruleFlow" + File.separator;public final static String STATE_NEW = "1";public final static String STATE_PUBLISH = "2";public final static String VERSION_INIT_VALUE = "0.01";public final static String UNDERLINE = "_";private String project;private String type;private String code;private String name;@XmlCDATAprivate String data;private String state;private String version;private String createDate;private String creatorId;private String updateDate;private String updatorId;public RuleFlowModel(){}public String getProject(){return project;}public void setProject(String project){this.project = project;}public String getType(){return type;}public void setType(String type){this.type = type;}public String getCode(){return code;}public void setCode(String code){this.code = code;}public String getName(){return name;}public void setName(String name){this.name = name;}public String getData(){return data;}public void setData(String data){this.data = data;}public String getState(){return state;}public void setState(String state){this.state = state;}public String getVersion(){return version;}public void setVersion(String version){this.version = version;}public String getCreateDate(){return createDate;}public void setCreateDate(String createDate){this.createDate = createDate;}public String getCreatorId(){return creatorId;}public void setCreatorId(String creatorId){this.creatorId = creatorId;}public String getUpdateDate(){return updateDate;}public void setUpdateDate(String updateDate){this.updateDate = updateDate;}public String getUpdatorId(){return updatorId;}public void setUpdatorId(String updatorId){this.updatorId = updatorId;}}
data.bpmn规则引擎定义文件,就是为了用设计器生成这个文件。myflow.js 百度有,但是混淆和压缩的。

今天面试官问了很多事,我都记不起来了。这几年确实做了很多事。

不是不想记得,而是根本没法子记得了。针对最近的问题,我要好好复习一下。脑袋的内存很宝贵,记住最美好的事。




针对这些问题,我觉得本身我自己的工作也有关系。另外就是企业本身嘛,多数岗位的内容有点交错。


只为成功寻找方向。



原创粉丝点击