(function ($) { var defaults = { processData: {}, //步骤节点数据 //processUrl:'',//步骤节点数据 fnRepeat: function () { alert("步骤连接重复"); }, fnClick: function () { alert("单击"); }, fnDbClick: function () { alert("双击"); }, canvasMenus: { "one": function (t) { alert('画面右键') } }, processMenus: { "one": function (t) { alert('步骤右键'); } }, canvasLabMenu: { "one": function (t) { alert('标签右键') } }, /*右键菜单样式*/ menuStyle: { border: '1px solid #5a6377', minWidth: '150px', }, itemStyle: { color: '#333', fontSize: '12px', border: '0', /*borderLeft:'5px solid #fff',*/ padding: '5px 15px 5px 10px' }, itemHoverStyle: { border: '0', cursor: 'pointer', /*borderLeft:'5px solid #49afcd',*/ color: '#fff', /*backgroundColor: '#2980b9'*/ }, mtAfterDrop: function (params) { //alert('连接成功后调用'); //alert("连接:"+params.sourceId +" -> "+ params.targetId); }, //这是连接线路的绘画样式 connectorPaintStyle: { lineWidth: 3, strokeStyle: "#4f7bba", joinstyle: "round" }, //鼠标经过样式 connectorHoverStyle: { lineWidth: 3, strokeStyle: "#32b291" } }; /*defaults end*/ var initEndPoints = function () { $(".process-flag").each(function (i, e) { var p = $(e).parent(); jsPlumb.makeSource($(e), { parent: p, anchor: "Continuous", endpoint: ["Dot", { radius: 1 }], connector: ["Flowchart", { stub: [5, 5] }], connectorStyle: defaults.connectorPaintStyle, hoverPaintStyle: defaults.connectorHoverStyle, dragOptions: {}, maxConnections: -1 }); }); } /*设置隐藏域保存关系信息*/ var aConnections = []; var setConnections = function (conn, remove) { if (!remove) aConnections.push(conn); else { var idx = -1; for (var i = 0; i < aConnections.length; i++) { if (aConnections[i] == conn) { idx = i; break; } } if (idx != -1) aConnections.splice(idx, 1); } if (aConnections.length > 0) { var s = ""; for (var j = 0; j < aConnections.length; j++) { var from = $('#' + aConnections[j].sourceId).attr('process_id'); var target = $('#' + aConnections[j].targetId).attr('process_id'); s = s + ""; } $('#leipi_process_info').html(s); } else { $('#leipi_process_info').html(''); } jsPlumb.repaintEverything(); //重画 }; /*Flowdesign 命名纯粹为了美观,而不是 formDesign */ $.fn.Flowdesign = function (options) { var _canvas = $(this); //右键步骤的步骤号 _canvas.append(''); _canvas.append('
'); /*配置*/ $.each(options, function (i, val) { if (typeof val == 'object' && defaults[i]) $.extend(defaults[i], val); else defaults[i] = val; }); /*画布右键绑定*/ var contextmenu = { bindings: defaults.canvasMenus, menuStyle: defaults.menuStyle, itemStyle: defaults.itemStyle, itemHoverStyle: defaults.itemHoverStyle } $(this).contextMenu('canvasMenu', contextmenu); jsPlumb.importDefaults({ DragOptions: { cursor: 'pointer' }, EndpointStyle: { fillStyle: '#225588' }, Endpoint: ["Dot", { radius: 1 }], ConnectionOverlays: [ ["Arrow", { location: 1 }], ["Label", { location: 0.1, id: "label", cssClass: "aLabel" }] ], Anchor: 'Continuous', ConnectorZIndex: 5, HoverPaintStyle: defaults.connectorHoverStyle }); if ($.browser.msie && $.browser.version < '9.0') { //ie9以下,用VML画图 jsPlumb.setRenderMode(jsPlumb.VML); } else { //其他浏览器用SVG jsPlumb.setRenderMode(jsPlumb.SVG); } //初始化原步骤 var lastProcessId = 0; var processData = defaults.processData; if (processData.list) { $.each(processData.list, function (i, row) { var nodeDiv = document.createElement('div'); var nodeId = "window" + row.id, badge = 'badge-inverse', icon = 'icon-star'; if (lastProcessId == 0)//第一步 { badge = 'badge-info'; icon = 'icon-play'; } if (row.icon) { icon = row.icon; } $(nodeDiv).attr("id", nodeId) .attr("style", row.style) .attr("process_to", row.process_to) .attr("process_id", row.id) .addClass("process-step btn btn-small")//给节点名称添加一个span元素 .html(' ' + row.process_name + '') .mousedown(function (e) { if (e.which == 3) { //右键绑定 _canvas.find('#leipi_active_id').val(row.id); contextmenu.bindings = defaults.processMenus; var nodeID = document.getElementById("leipi_active_id"); if (nodeID.value.indexOf("S_") != -1) { // $(this).contextMenu('processMenu', contextmenu); return; } var node = new Entity("BP.WF.Node", nodeID.value); //如果是第一个节点,把接收人规则文字换成可启动流程的人员 if (nodeID.value.substr(nodeID.value.length - 2) == "01") $('#pmNodeAccepterRole span').text("设置发起人"); else if (node.NodeType == 0) $('#pmNodeAccepterRole span').text("设置接受人"); else $('#pmNodeAccepterRole').hide(); if (node.RunModel == 0) { $('#pmfun span').text("线型:" + nodeID.value); } if (node.RunModel == 1) { $('#pmfun span').text("合流:" + nodeID.value); } if (node.RunModel == 2) { $('#pmfun span').text("分流:" + nodeID.value); } if (node.RunModel == 3) { $('#pmfun span').text("分合流:" + nodeID.value); } if (node.RunModel == 4) { $('#pmfun span').text("子线程:" + nodeID.value); } if (node.FWCSta == 0) { $('#pmWorkCheck span').text("审核组件-禁用"); } if (node.FWCSta == 1) { $('#pmWorkCheck span').text("审核组件-启用"); } if (node.FWCSta == 2) { $('#pmWorkCheck span').text("审核组件-只读"); } $(this).contextMenu('processMenu', contextmenu); ////$(this).contextMenu('processMenu3', contextmenu); //$(this).mouseenter(function () { // $(this).contextMenu('processMenu3', contextmenu); //}); } }); _canvas.append(nodeDiv); //索引变量 lastProcessId = row.id; }); //each } //显示标签 var labNoteData = defaults.labNoteData; if (labNoteData.list) { $.each(labNoteData.list, function (i, lab) { var labDiv = document.createElement('div'); var labId = "lab" + lab.id, badge = 'badge-inverse'; $(labDiv).attr("id", labId) .attr("style", lab.style) .attr("process_id", lab.id) .addClass("process-lab") .html(' ' + lab.process_name + '') .mousedown(function (e) { if (e.which == 3) { //右键绑定 _canvas.find('#leipi_active_id').val(lab.id); contextmenu.bindings = defaults.canvasLabMenu; $(this).contextMenu('canvasLabMenu', contextmenu); } }) .dblclick(function (e) { console.log('e', e.currentTarget.id); var activeId = e.currentTarget.id.replace('lab', ''); //右键当前的ID var windowtext = $("#lab" + activeId).text(); windowtext = windowtext.replace(/(^\s*)|(\s*$)/g, ""); //去掉左右空格. $("#alertModal3 div:eq(2) button").attr("class", "btn btn-primary savetext" + activeId); $("#alertModal3 div:eq(2) button").attr("onclick", "saveLabName(\"" + activeId + "\")"); var xiuNodename = '' $("#lab" + activeId + " span").html(); labAlert(xiuNodename); }); _canvas.append(labDiv); }); } var timeout = null; //点击或双击事件,这里进行了一个单击事件延迟,因为同时绑定了双击事件 $(".process-step").live('click', function () { //激活 _canvas.find('#leipi_active_id').val($(this).attr("process_id")), clearTimeout(timeout); var obj = this; timeout = setTimeout(defaults.fnClick, 300); }).live('dblclick', function () { clearTimeout(timeout); defaults.fnDbClick(); }); //使节点可拖动 jsPlumb.draggable(jsPlumb.getSelector(".process-step"), { containment: $("#flowdesign_canvas") }); initEndPoints(); //使标签可拖动 jsPlumb.draggable(jsPlumb.getSelector(".process-lab"), { containment: $("#flowdesign_canvas") }); initEndPoints(); //绑定添加连接操作。画线-input text值 拒绝重复连接 jsPlumb.bind("jsPlumbConnection", function (info) { if (info.sourceId == info.targetId) { jsPlumb.detach(info); return; } setConnections(info.connection) }); //绑定删除connection事件 jsPlumb.bind("jsPlumbConnectionDetached", function (info) { setConnections(info.connection, true); }); //绑定删除确认操作 jsPlumb.bind("click", function (c) { fAlert("", 0, c); $("#lineDel").unbind("click"); $("#lineSet").unbind("click"); $("#lineLabSave").unbind("click"); //删除节点方向连接线 $("#lineDel").click(function () { //获取连接线连接的ID var fromNodeID = c.sourceId.replace('window', ''); var toNodeID = c.targetId.replace('window', ''); //获取流程编号 var flowNo = GetQueryString("FK_Flow"); if (window.confirm("您确定要删除从节点[" + fromNodeID + "],到节点[" + toNodeID + "]吗?") == false) return; var hander = new HttpHandler("BP.WF.HttpHandler.WF_Admin_CCBPMDesigner2018"); hander.AddPara("FK_Node", fromNodeID); hander.AddPara("FK_Flow", flowNo); hander.AddPara("ToNode", toNodeID); var data = hander.DoMethodReturnString("Direction_Delete"); if (data.indexOf('err@') == 0) { alert(data); //删除失败的情况. return; } jsPlumb.detach(c); }); $("#lineSet").click(function () { var fromNodeID = c.sourceId.replace('window', ''); var targetId = c.targetId.replace('window', ''); var flowNo = GetQueryString("FK_Flow"); var url = ""; if (GetHrefUrl().indexOf("/WF/Admin/CCBPMDesigner") == -1) url = basePath + "/WF/Admin/"; else url = "../"; url += "Cond2020/ConditionLine.htm?FK_Flow=" + flowNo + "&FK_MainNode=" + fromNodeID + "&FK_Node=" + fromNodeID + "&ToNodeID=" + targetId + "&CondType=2&Lang=CH&t=" + new Date().getTime(); $("#LineModal").hide(); $(".modal-backdrop").hide(); var w = window.innerWidth - 240; var h = window.innerHeight - 120; CondDir(fromNodeID); return; OpenEasyUiDialog(url, flowNo + fromNodeID + "DIRECTION" + targetId, "设置方向条件" + fromNodeID + "->" + targetId, w, h, "icon-property", true, null, null, null, function () { }); }) $("#lineLabSave").click(function () { //获取连接线连接的ID var fromNodeID = c.sourceId.replace('window', ''); var toNodeID = c.targetId.replace('window', ''); //获取流程编号 var flowNo = GetQueryString("FK_Flow"); var dirLabId = "TB_Direction_LAB_" + fromNodeID + "_" + toNodeID; var des = $("#" + dirLabId).val(); des = des.replace(/(^\s*)|(\s*$)/g, ""); var hander = new HttpHandler("BP.WF.HttpHandler.WF_Admin_CCBPMDesigner2018"); hander.AddPara("FK_Node", fromNodeID); hander.AddPara("FK_Flow", flowNo); hander.AddPara("ToNode", toNodeID); hander.AddPara("Des", des); var data = hander.DoMethodReturnString("Direction_Save"); if (data.indexOf('err@') == 0) { alert(data); //删除失败的情况. return; } c.removeOverlay("des_" + fromNodeID + "_" + toNodeID); c.addOverlay(['Label', { label: '', width: 12, length: 12, location: 0.5, id: "des_" + fromNodeID + "_" + toNodeID, events: { click: function (labelOverlay, originalEvent) { } } }]) }) // if(confirm("你确定取消连接吗?是:取消 否:方向指向")) // { // jsPlumb.detach(c); // } // else // { // window.open(''); // } }); //连接成功回调函数 function mtAfterDrop(params) { //console.log(params) //创建一个实体. 保存连接线 var dir = new Entity("BP.WF.Template.Direction"); dir.FK_Flow = flowNo; dir.Node = $('#' + params.sourceId).attr('process_id'); dir.ToNode = $('#' + params.targetId).attr('process_id'); dir.MyPK = dir.FK_Flow + "_" + dir.Node + "_" + dir.ToNode; dir.DirType = 2; dir.Save(); //defaults.mtAfterDrop({ sourceId: $("#" + params.sourceId).attr('process_id'), targetId: $("#" + params.targetId).attr('process_id') }); } jsPlumb.makeTarget(jsPlumb.getSelector(".process-step"), { dropOptions: { hoverClass: "hover", activeClass: "active" }, anchor: "Continuous", maxConnections: -1, endpoint: ["Dot", { radius: 1 }], paintStyle: { fillStyle: "#ec912a", radius: 1 }, hoverPaintStyle: this.connectorHoverStyle, beforeDrop: function (params) { if (params.sourceId == params.targetId) return false; /*不能链接自己*/ var j = 0; $('#leipi_process_info').find('input').each(function (i) { var str = $('#' + params.sourceId).attr('process_id') + ',' + $('#' + params.targetId).attr('process_id'); if (str == $(this).val()) { j++; return; } }) if (j > 0) { defaults.fnRepeat(); return false; } else { mtAfterDrop(params); return true; } } }); //reset start var _canvas_design = function () { //连接关联的步骤 $('.process-step').each(function (i) { var sourceId = $(this).attr('process_id'); //var nodeId = "window"+id; var prcsto = $(this).attr('process_to'); var toArr = prcsto.split(","); var processData = defaults.processData; $.each(toArr, function (j, targetId) { if (targetId != '' && targetId != 0) { //检查 source 和 target是否存在 var is_source = false, is_target = false; $.each(processData.list, function (i, row) { if (row.id == sourceId) { is_source = true; } else if (row.id == targetId) { is_target = true; } if (is_source && is_target) return true; }); if (is_source && is_target) { var desid = sourceId + "_" + targetId; var linedes = processData.process_des.filter(function (el) { return el.id == desid; })[0].des; jsPlumb.connect({ source: "window" + sourceId, target: "window" + targetId, overlays: [ ['Label', { label: '', width: 12, length: 12, location: 0.5, id: "des_" + sourceId + "_" + targetId, events: { click: function (labelOverlay, originalEvent) { } } }]] /* ,labelStyle : { cssClass:"component label" } ,label : id +" - "+ n*/ }); return; } } }) }); } //_canvas_design end reset _canvas_design(); //-----外部调用---------------------- var Flowdesign = { addProcess: function (row) { if (row.id <= 0) { return false; } var nodeDiv = document.createElement('div'); var nodeId = "window" + row.id, badge = 'badge-inverse', icon = 'icon-star'; if (row.icon) { icon = row.icon; } $(nodeDiv).attr("id", nodeId) .attr("style", row.style) .attr("process_to", row.process_to) .attr("process_id", row.id) .addClass("process-step btn btn-small") .html(' ' + row.process_name + '') .mousedown(function (e) { if (e.which == 3) { //右键绑定 _canvas.find('#leipi_active_id').val(row.id); contextmenu.bindings = defaults.processMenus; var nodeID = document.getElementById("leipi_active_id"); var node = new Entity("BP.WF.Node", nodeID.value); $('#pmAttribute span').text("节点属性"); if (node.RunModel == 0) { $('#pmfun span').text("普通" + nodeID.value); } if (node.RunModel == 1) { $('#pmfun span').text("合流"); } if (node.RunModel == 2) { $('#pmfun span').text("分流"); } if (node.RunModel == 3) { $('#pmfun span').text("分合流"); } if (node.RunModel == 4) { $('#pmfun span').text("子线程"); } if (node.FWCSta == 0) { $('#pmWorkCheck span').text("审核组件-禁用"); } if (node.FWCSta == 1) { $('#pmWorkCheck span').text("审核组件-启用"); } if (node.FWCSta == 2) { $('#pmWorkCheck span').text("审核组件-只读"); } $(this).contextMenu('processMenu', contextmenu); } }); _canvas.append(nodeDiv); //使之可拖动 和 连线 jsPlumb.draggable(jsPlumb.getSelector(".process-step")); initEndPoints(); //使可以连接线 jsPlumb.makeTarget(jsPlumb.getSelector(".process-step"), { dropOptions: { hoverClass: "hover", activeClass: "active" }, anchor: "Continuous", maxConnections: -1, endpoint: ["Dot", { radius: 1 }], paintStyle: { fillStyle: "#ec912a", radius: 1 }, hoverPaintStyle: this.connectorHoverStyle, beforeDrop: function (params) { var j = 0; $('#leipi_process_info').find('input').each(function (i) { var str = $('#' + params.sourceId).attr('process_id') + ',' + $('#' + params.targetId).attr('process_id'); if (str == $(this).val()) { j++; return; } }) if (j > 0) { defaults.fnRepeat(); return false; } else { return true; } } }); return true; }, addLabProcess: function (lab) { if (lab.id <= 0) { return false; } var labDiv = document.createElement('div'); var labId = "lab" + lab.id, badge = 'badge-inverse'; $(labDiv).attr("id", labId) .attr("style", lab.style) .attr("process_id", lab.id) .addClass("process-lab") .html(' ' + lab.process_name + '') .mousedown(function (e) { if (e.which == 3) { //右键绑定 _canvas.find('#leipi_active_id').val(lab.id); contextmenu.bindings = defaults.canvasLabMenu; $(this).contextMenu('canvasLabMenu', contextmenu); } }); _canvas.append(labDiv); //使之可拖动 和 连线 jsPlumb.draggable(jsPlumb.getSelector(".process-lab")); initEndPoints(); return true; }, delProcess: function (activeId) { if (activeId <= 0) return false; $("#window" + activeId).remove(); return true; }, delLabNote: function (activeId) { if (activeId <= 0) return false; $("#lab" + activeId).remove(); return true; }, getActiveId: function () { return _canvas.find("#leipi_active_id").val(); }, copy: function (active_id) { if (!active_id) active_id = _canvas.find("#leipi_active_id").val(); _canvas.find("#leipi_copy_id").val(active_id); return true; }, paste: function () { return _canvas.find("#leipi_copy_id").val(); }, getProcessInfo: function () { try { /*连接关系*/ var aProcessData = {}; $("#leipi_process_info input[type=hidden]").each(function (i) { var processVal = $(this).val().split(","); if (processVal.length == 2) { if (!aProcessData[processVal[0]]) { aProcessData[processVal[0]] = { "top": 0, "left": 0, "process_to": [] }; } aProcessData[processVal[0]]["process_to"].push(processVal[1]); } }) /*位置*/ _canvas.find("div.process-step").each(function (i) { //生成Json字符串,发送到服务器解析 if ($(this).attr('id')) { var pId = $(this).attr('process_id'); var pLeft = parseInt($(this).css('left')); var pTop = parseInt($(this).css('top')); if (!aProcessData[pId]) { aProcessData[pId] = { "top": 0, "left": 0, "process_to": [] }; } aProcessData[pId]["top"] = pTop; aProcessData[pId]["left"] = pLeft; } }) return JSON.stringify(aProcessData); } catch (e) { return ''; } }, getLabNoteInfo: function () { try { var aLabNoteData = {}; /*位置*/ _canvas.find("div.process-lab").each(function (i) { //生成Json字符串,发送到服务器解析 if ($(this).attr('id')) { var pId = $(this).attr('process_id'); var pLeft = parseInt($(this).css('left')); var pTop = parseInt($(this).css('top')); if (!aLabNoteData[pId]) { aLabNoteData[pId] = { "top": 0, "left": 0 }; } aLabNoteData[pId]["top"] = pTop; aLabNoteData[pId]["left"] = pLeft; } }) return JSON.stringify(aLabNoteData); } catch (e) { return ''; } }, clear: function () { try { jsPlumb.detachEveryConnection(); jsPlumb.deleteEveryEndpoint(); $('#leipi_process_info').html(''); jsPlumb.repaintEverything(); return true; } catch (e) { return false; } }, refresh: function () { try { //jsPlumb.reset(); this.clear(); _canvas_design(); return true; } catch (e) { return false; } } }; return Flowdesign; } //$.fn })(jQuery);