svg.js
var id = "";
var sURL = window.location.href;
var p_question = sURL.indexOf("?");
var p_start = sURL.indexOf("=");
if (p_start != -1)
id = sURL.substring(p_question + 1, p_start);
var doubleSlash = sURL.indexOf("//");
var firstSlash = sURL.indexOf("/", doubleSlash + 2);
var secSlash = sURL.indexOf("/", firstSlash + 1);
if ("svgid" == id)
{
var sec_p = sURL.indexOf("=", p_start + 1);
if (sec_p != -1)
id = sURL.substring(p_start + 1, sURL.indexOf(sec_p));
else
id = sURL.substring(p_start + 1);
var xmlHttp = getXmlHttp();
if (null != xmlHttp)
{
/* var doubleSlash = sURL.indexOf("//");
var firstSlash = sURL.indexOf("/", doubleSlash + 2);
var secSlash = sURL.indexOf("/", firstSlash + 1);*/
var url = sURL.substring(0, secSlash)
+ "/bizmonitor/SVGAction.do?id=" + encodeURIComponent(id);
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4)
{
if (xmlHttp.status == 200)
{
var json = eval("(" + xmlHttp.responseText + ")");
for (i in json)
{
var dom = document.getElementById(i);
if (dom != null)
{
dom.removeAttribute("class");
dom.setAttribute("stroke", "#000000");
// The work flow state has ended.
if (json[i] == 1)
dom.setAttribute("fill", "#6FA45E");
else if (json[i] == 2)// The work flow state is being processed...
dom.setAttribute("fill", "#FD5D5D");
else
{
// Default or unprocessed status temporary,
// keep unchanged,and nothing to do.
}
}
}
} else {
alert('wrong: ' + xmlHttp.status);
}
}
};
xmlHttp.send(null);
}
}
else if ("koName" == id)
{
var xmlHttp = getXmlHttp();
if(xmlHttp != null)
{
var koName = sURL.substring(p_start+1);
var url = sURL.substring(0, secSlash) + "/svgProcess.do?koName=" + koName + "&type=getWorkItemTask";
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4)
{
if (xmlHttp.status == 200)
{
var json = eval("(" + xmlHttp.responseText + ")");
for (i in json)
{
var dom = document.getElementById(i);
if (dom != null)
{
//alert(i + ", " + json[i]);
createNode(i, json[i]);
}
}
}
else
alert('wrong: ' + xmlHttp.status);
}
};
xmlHttp.send(null);
}
}
else
{
var p = sURL.lastIndexOf("=");
if (p != -1)
{
id = sURL.substr(p + 1);
var sDom = document.getElementById(id);
if (sDom != null)
{
sDom.removeAttribute("class");
// sDom.setAttribute("fill","url(#grad1)");
sDom.setAttribute("fill", "#FD5D5D");
sDom.setAttribute("stroke", "#000000");
}
}
}
};
function getXmlHttp()
{
var xmlHttp = null;
if (window.XMLHttpRequest)
xmlHttp = new XMLHttpRequest();
else if (window.ActiveXObject)
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
return xmlHttp;
}
function createNode(id, count)
{
var dom = document.getElementById(id);
//dom.removeAttribute("class");
//dom.setAttributeNS(null, "stroke", "#000000");
//dom.setAttributeNS(null, "fill", "#FD5D5D");
var x, y;
var textAnchor;
var rectX, rectY;
if(dom.nodeName == "ellipse" || dom.nodeName == "circle")
{
x = dom.getAttribute("cx");
y = dom.getAttribute("cy");
var tempX = x;
var tempY = y;
y = parseInt(tempY) + 10;
rectX = parseInt(tempX)-29;
rectY = tempY;
textAnchor = "middle";
}
else if(dom.nodeName == "rect")
{
x = dom.getAttribute("x");
y = dom.getAttribute("y");
var tempX = x;
var tempY = y;
textAnchor = "start";
x = parseInt(tempX) + 9;
y = parseInt(tempY) + 51;
rectX = parseInt(tempX) + 5;
rectY = parseInt(tempY) + 43;
}
else if(dom.nodeName == "path")
{
var str = dom.getAttribute("d");
var spaceFirst = str.indexOf(" ");// According to the path attribute Mxx XXX Lxxx take decided to reference SVG manual
var spaceSec = str.indexOf(" ", spaceFirst + 1);
var x = str.substring(1, spaceFirst);// Take out the first letter 'M'
var y = str.substring(spaceFirst + 1, spaceSec - 1);
var tempX = x;
var tempY = y;
y = parseInt(tempY) - 7;
rectX = parseInt(tempX) -29;
rectY = parseInt(tempY) -15;
textAnchor = "middle";
}
var text = document.createElementNS("http://www.w3.org/2000/svg","text");
text.setAttributeNS(null, "fill", "#000000");
text.setAttributeNS(null, "x", x);
text.setAttributeNS(null, "y", y);
text.setAttributeNS(null, "text-anchor", textAnchor);
text.setAttributeNS(null, "font-size", "8px");
text.appendChild(document.createTextNode("有" + count + "条待办事项"));
var rect = document.createElementNS("http://www.w3.org/2000/svg","rect");
rect.setAttributeNS(null, "x", rectX);
rect.setAttributeNS(null, "y", rectY);
rect.setAttributeNS(null, "width", "60px");
rect.setAttributeNS(null, "height","12px");
rect.setAttributeNS(null, "fill", "#FEFEA6");
var pDom = dom.parentNode;
pDom.appendChild(rect);
pDom.appendChild(text);
}
overall.js
var url = window.location.href;
var p = url.indexOf("/", 8);
if(-1 != p)
url = url.substring(0, p + 1);
// 总体流程框架条件
var processKos = '{"设备销售流程":"fJmKR9T5nsT", "设备售后服务流程":"bfa7ffcc12f13b23b38fa7cf0bcb54", "设备采购及安装流程":"bfa7ffcc12f142a7e3ddae8ed90c87", "耗材销售流程":"bcjUMVEEeQ7","设备耗材客户投诉处理流程":"bfa7ffcc12e554326431de8dfc4871"}';
var width=800;
var height=600;
var x = parseInt(screen.width / 2.0) - (width / 2.0);
var y = parseInt(screen.height / 2.0) - (height / 2.0);
var urlParam = "width="+ width+ ",height="+ height+ ",top="+ y+ ",left="+ x+ ",modal=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes,location=no, status=no";
// 打开url非中文的连接
function openWindow(url)
{
try
{
// 默认支持svg的浏览器
window.open(url,'pop',urlParam);
}
catch (e)
{
// Adobe viewer 等需要第三方插件支持的svg的浏览器
browserEval("window.open('" + url + "', 'pop', '" + urlParam + "')");
}
}
// 处理具体的作业,进入任务处理栏
function processWorkItem(koName, workId, workName)
{
var purl;
if(workId == "" || workId == "undefined")
{
var pros = eval('(' + processKos + ')');
//purl = url + "app/svgProcess.do?processId=" + pros[koName] + "&type=" + "startProcess";// 启动流程 TODO
purl= url + "app/bizstation/GetFuncDetailAction.do?processId=" + pros[koName] + "&type=" + "startProcess";
}
else
purl = url + "app/bizstation/GetWorkDetailAction.do?workItemId="+ workId +"&workName="+ workName+"&proName="+ koName + "&opId=12&enabled=0";
openWindow(purl);
}
// 绑定主流程文本事件,传递流程KO.id/流程名称
function bindProcessEvent()
{
var jsonKos = eval('(' + processKos + ')');
for(var key in jsonKos)
{
var koId = jsonKos[key];
var koDocText = document.getElementById(koId);
if(koDocText != null)
koDocText.setAttributeNS(null, "onclick", "processEvent('"+ key +"')");
}
}
// 处理主流程文本事件
function processEvent(koName)
{
var purl = url + "app/images/svg/" + koName +".svg?koName=" + encodeURI(encodeURI(koName));
try
{
window.open(purl,'pop',urlParam);
}
catch (e)
{
purl = url + "app/images/svg/" + encodeURIComponent(encodeURIComponent(koName)) +".svg?koName=" + encodeURI(encodeURI(koName));
browserEval("window.open('" + purl + "', 'pop', '" + urlParam + "')");
}
}
function Send(url, processKos)
{
this.url = url;
this.processKos = processKos;
}
//具体流程对象,koId=流程KO.ID, koName=流程名称, processes=流程数组
function ProcessKo(koId, koName, processes, modelId)
{
this.koId = koId;
this.koName = koName;
this.processes = processes;
this.modelId = modelId;
this.addEventText = addEventText;
}
function Process(processId,workItems)
{
this.processId = processId;
this.workItems = workItems;
}
function WorkItem(workId, workName)
{
this.workId = workId;
this.workName = workName;
}
// 设置文本框及容器的可见性
function switchAttrVisable(sdom) {
if (null != sdom) {
var attr = sdom.getAttribute("visibility");
if ("visible" == attr)
sdom.setAttribute("visibility", 'hidden');
else
sdom.setAttribute("visibility", "visible");
}
}
// 显示流程中具体作业信息;jsoKo为流程信息集合;
function showItems(koId, koName, processes)
{
var gdoc = document.getElementById(koId + "_g");
var rdoc = document.getElementById(koId + "_r");
var x, y, tempY;
if(gdoc != null && rdoc != null)
{// 准备显示作业信息
switchAttrVisable(gdoc);
switchAttrVisable(rdoc);
removeTextNode(gdoc);
x = rdoc.getAttribute("x");
y = rdoc.getAttribute("y");
}
if(processes != "undefined")
{
var f = 0;// 标记作业个数,辅助计算文本坐标位置
var json = eval('(' + processes + ')');
for(var i in json)
{
var j = 0;
for(var k in json[i])
{
var processId;
if(typeof(k) == "string" && k != "toJSONString")
processId = k;// 流程ID
if(processId != "undefined")
{
var json2 = json[i][k];// 作业数组
for(var m in json2)
{
for(var n in json2[m])
{
if(typeof(json2[m][n]) == "string")
{
f++;
var workId = n;
var workName = json2[m][n];
var tx = parseFloat(x) + 4; // 文本横坐标
var ty = parseFloat(y) + 15 * f; // 文本纵坐标
tempY = ty;
createTextNode(koName, processId, workId, workName, rdoc, gdoc, tx, ty);
//alert(processId + ": [" + workId + ", " + workName + "]");
}
}
}
}
}
}
var startX = parseFloat(x) + 4;
var startY = parseFloat(tempY) + 15;
createTextNode(koName, processId, '', '启动', rdoc, gdoc, startX, startY);
}
else
{
var startX = parseFloat(x) + 4;
var startY = parseFloat(y) + 15;
createTextNode(koName, '', '', '启动', rdoc, gdoc, startX, startY);
}
}
// 移除文本节点
function removeTextNode(gdoc)
{
if (null != gdoc) {
while (gdoc.childNodes.length > 0) {
for ( var i = 0; i < gdoc.childNodes.length; i++) {
gdoc.removeChild(gdoc.childNodes.item(i));
}
}
}
}
//创建文本节点
function createTextNode(koName, processId, workId, workName, rdoc, gdoc, tx, ty)
{
var nodeVal;
nodeVal = workId + workName; // 节点要显示的信息
if(nodeVal.length > 27)
nodeVal = nodeVal.substring(0, 24) + "....";// 保持长度在26个字符以内,超出用省略号代替,使用鼠标移动提示处理具体信息
var a = document.createElementNS("http://www.w3.org/2000/svg", "a");
a.setAttributeNS("link", "xlink:href", "");
var text = document.createElementNS("http://www.w3.org/2000/svg",
"text");
text.setAttributeNS(null, "class", "linkText");
text.setAttributeNS(null, "x", tx);
text.setAttributeNS(null, "y", ty);
text.setAttributeNS(null, "onclick", "processWorkItem('"+ koName +"','"+ workId +"','"+ workName +"')");
text.appendChild(document.createTextNode(nodeVal));
var attr = document
.createElementNS("http://www.w3.org/2000/svg", "set");
attr.setAttributeNS(null, "attributeName", "stroke");
attr.setAttributeNS(null, "from", "#68A4FF");
attr.setAttributeNS(null, "to", "red");
attr.setAttributeNS(null, "begin", "mouseover");
attr.setAttributeNS(null, "end", "mouseout");
text.appendChild(attr);
a.appendChild(text);
if (null != gdoc)
gdoc.appendChild(a);
}
// 绑定待办事项文本事件
function addEventText()
{
var text = document.getElementById(this.koId + "_p");
if(text != null)
{
var str = format(this.processes);
if(str != "undefined")
text.setAttributeNS(null, "onclick", "showItems('"+ this.koId +"','"+ this.koName +"', '" + str + "')");
}
}
/* 格式化javascript对象(ProcessKo)为json格式字符串
格式后为:var json = '[{"SB-售后服务-001":[{"SB-售后服务-001_A3":"流水线规划"},{"SB-售后服务-001_A4":"与客户确认基础培训计划"}]},{"SB-售后服务-002":[{"SB-售后服务-002_E1":"收到客户支付款项"}]}]';
*/
function format(obj)
{
if(obj.length > 0)
{
var str = "[";
for(var j=0; j< obj.length; j++)
{
str +="{";
var process = obj[j];
str += "\""+ process.processId + "\"" + ":[";
var works = obj[j].workItems;
for(var w=0; w<works.length; w++)
{
str +="{" +"\""+ works[w].workId + "\"" + ":" + "\"" + works[w].workName + "\""+"}";
if(w < works.length-1)
str += ",";
}
if(j< obj.length-1)
str += "]},"
else
str += "]}";
}
str += "]";
}
return str;
}
// 处理所有主流程信息设定
function setProcessTask(koId, count)
{
var tspanId = koId + "_t";
var parentId = koId + "_p";
var tspan = document.getElementById(tspanId);
var parentText = document.getElementById(parentId);
if(tspan != null)
{
if(count == 0)
tspan.setAttributeNS(null, "stroke", "#FF0000");
tspan.firstChild.nodeValue = "(" + count + ")";
}
}
Send.prototype.sendData = function()
{
var xmlHttp = null;
if(window.ActiveXObject)
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
else if(window.XMLHttpRequest)
xmlHttp = new XMLHttpRequest();
if(xmlHttp != null)
{
// alert('send....');
xmlHttp.open("POST", this.url ,true );
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4 )
{
if (xmlHttp.status == 200 )
{
var kos = xmlHttp.responseText;
if(kos != "undefined")
{
jsonKos = eval('(' + kos + ')');
for(i in jsonKos)
{
var koId = jsonKos[i].id;
var koCount = jsonKos[i].count;
var koName = jsonKos[i].name;// 流程名称
setProcessTask(koId, koCount);
var processSet = jsonKos[i].processSet;
var pk;
if(processSet == null)
{
pk = new ProcessKo(koId, koName, null);
pk.addEventText();// 为每个流程增加事件
}
if(typeof(processSet) == "object")
{
var processes = new Array();// 存放ko中的具体流程对象的数组
for(var p=0; p<processSet.length; p ++)
{
var processId = processSet[p].id;
if( typeof(processId) != "undefined")
{
var workItems = processSet[p].workToDoSet; // 作业集合包含相同流程名称的不同流程id的作业
var workItemsArray = new Array();// 存放作业对象的数组
if(typeof(workItems) == "object" && workItems != null)
{
for(var w=0; w<workItems.length; w++)
{
var workId = workItems[w].id;// 作业id
var workName = workItems[w].name;// 作业名称
var workItem = new WorkItem(workId, workName);
workItemsArray.push(workItem);
}
}
}
var process = new Process(processId, workItemsArray);
processes.push(process);
}
var pk = new ProcessKo(koId, koName, processes);
pk.addEventText();// 为每个流程增加事件
}
}
}
}
else
alert('wrong: ' + xmlHttp.status) ;
}
};
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send("processKos=" + this.processKos); // 发送请求
}
}
window.onload = function()
{
var sUrl = url + "app/svgProcess.do";
var send = new Send(sUrl, processKos);
send.sendData();
bindProcessEvent();
}
function interval(){}// 虚拟的方法,屏蔽打开文本时候超链接出现的异常
overall.svg/
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg id="svgid" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="1024px" height="610px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
<![CDATA[
.str3 {stroke:black;stroke-width:0.900001}
.str0 {stroke:black;stroke-width:1.53543}
.str2 {stroke:black;stroke-width:2.12599;cursor:pointer}
.str1 {stroke:black;stroke-width:2.12599;stroke-dasharray:2.125986 2.125986}
.fil0 {fill:none}
.fil6 {fill:black}
.fil5 {fill:#003399}
.fil1 {fill:black;font-size:14px}
.fil2 {fill:blue;fill-rule:nonzero;font-size:12px;}
.fil4 {fill:#003399;fill-rule:nonzero}
.fil3 {fill:black;fill-opacity:0.000000}
.linkText
{
text-anchor:start;
text-decoration:underline;
stroke-opacity:1;
fill-rule:nonzero;
font-size:12px;
fill:none;
stroke:#0066FF;
stroke-width:0.8px;
cursour:pointer;
}
.linkTextTitle
{
text-anchor:start;
text-decoration:underline;
stroke-opacity:1;
fill-rule:nonzero;
font-size:16px;
fill:none;
stroke:#0066FF;
stroke-width:0.8px;
cursour:pointer;
}
.taskItem
{
fill:none;
text-anchor:start;
font-size:13px;
stroke:#0066ff;
text-decoration:underline;
stroke-width:0.8;
cursour:pointer;
}
]]>
</style>
</defs>
<defs>
<script type="text/javascript" xlink:href="overall.js"></script>
</defs>
<rect style="stroke-width:1;fill:none;stroke:black" x="1.9998" y="13.4468" width="1020" height="57.7031" transform="matrix(0.9999999,0,0,0.67,-4.238418E-05,-4.174084)" visibility="visible" />
<text x="100.9998" y="13.4468" letter-spacing="4" transform="matrix(2.201999,0,0,2.164999,156.741,4.843808)">总体流程框架</text>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M670.647 336.272l-8.91969 -6.29174 9.70985 0 9.70985 6.3 -9.70985 6.29174 -9.70985 0 8.91969 -6.3zm-33.5339 -1.05827l34.324 0 0 2.11654 -34.324 0 0 -2.11654z" />
</g>
<rect class="fil0 str0" x="77.6503" y="288.099" width="111.366" height="93.8476" rx="20.1969" ry="20.1969" transform="matrix(1,0,0,1,0,-39)" />
<a xlink:href="">
<text id="fJmKR9T5nsT" x="84" y="300" class="linkTextTitle">设备销售流程</text>
</a>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M261.917 336.421l-8.91969 -6.29174 9.70985 0 9.70985 6.3 -9.70985 6.29174 -9.70985 0 8.91969 -6.3zm-72.9001 -0.767717l73.6902 0 0 1.53543 -73.6902 0 0 -1.53543z" />
</g>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M144.927 359.269l-0.767717 0.764174 -17.8795 0 0 -1.52835 17.8795 0 0.767717 0.764174zm-0.767717 -0.764174l0.767717 0 0 0.764174 -0.767717 -0.764174zm0 20.4851l-0.767717 -0.764174 0 -18.9567 1.53543 0 0 18.9567 -0.767717 0.764174zm0.767717 -0.764174l0 0.764174 -0.767717 0 0.767717 -0.764174zm-19.415 0l0.767717 -0.764174 17.8795 0 0 1.52835 -17.8795 0 -0.767717 -0.764174zm0.767717 0.764174l-0.767717 0 0 -0.764174 0.767717 0.764174zm0 -20.4851l0.767717 0.764174 0 18.9567 -1.53543 0 0 -18.9567 0.767717 -0.764174zm-0.767717 0.764174l0 -0.764174 0.767717 0 -0.767717 0.764174z" />
</g>
<g id="fJmKR9T5nsT_l" transform="matrix(1,0,0,1,0,-39)" xmlns="http://www.w3.org/2000/svg">
<line class="fil0 str2" x1="130.74" y1="368.748" x2="139.701" y2="368.748" />
<line class="fil0 str2" x1="135.22" y1="373.497" x2="135.22" y2="363.997" />
</g>
<rect class="fil0 str0" x="404.448" y="179.553" width="111.366" height="93.8476" rx="20.1969" ry="20.1969" transform="matrix(1,0,0,1,0,-39)" />
<a xlink:href="" transform="matrix(1,0,0,1,0,-39)">
<text id="bfa7ffcc12f13b23b38fa7cf0bcb54" x="412" y="220" class="linkTextTitle">设备售后服务</text>
<text id="bfa7ffcc12f13b23b38fa7cf0bcb54" x="435" y="240" class="linkTextTitle">流程</text>
</a>
<rect class="fil0 str0" x="404.61" y="402.952" width="111.366" height="93.8476" rx="20.1969" ry="20.1969" transform="matrix(1,0,0,1,0,-39)" />
<a xlink:href="" transform="matrix(1,0,0,1,20,-19)" id="bfa7ffcc12f142a7e3ddae8ed90c87">
<text x="392" y="422" class="linkTextTitle">设备采购及安</text>
<text x="408" y="442" class="linkTextTitle">装流程</text>
</a>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M388.591 225.79l-8.91969 -6.29174 9.70985 0 9.70985 6.3 -9.70985 6.29174 -9.70985 0 8.91969 -6.3zm-86.706 -0.767717l87.4961 0 0 1.53543 -87.4961 0 0 -1.53543z" />
</g>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M394.672 449.83l-8.91969 -6.29174 9.70985 0 9.70985 6.3 -9.70985 6.29174 -9.70985 0 8.91969 -6.3zm-92.7863 -0.767717l93.5764 0 0 1.53543 -93.5764 0 0 -1.53543z" />
</g>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M613.908 303.26l6.29174 -8.91969 0 9.70985 -6.3 9.70985 -6.29174 -9.70985 0 -9.70985 6.3 8.91969zm0.767717 -77.0753l0 77.8654 -1.53543 0 0 -77.8654 1.53543 0z" />
</g>
<line class="fil0 str0" x1="515.976" y1="226.186" x2="613.907" y2="226.186" transform="matrix(1,0,0,1,0,-39)" />
<line class="fil0 str0" x1="302.781" y1="314.021" x2="302.781" y2="225.51" transform="matrix(1,0,0,1,0,-39)" />
<line class="fil0 str0" x1="302.781" y1="449.83" x2="302.781" y2="357.881" transform="matrix(1,0,0,1,0,-39)" />
<polygon class="fil0 str0" points="274.69,335.322 302.781,314.021 327.814,334.873 302.781,357.88 " transform="matrix(1,0,0,1,0,-39)" />
<rect class="fil6 str0" x="290.523" y="333.582" width="25.9272" height="4.73914" transform="matrix(1,0,0,1,0,-39)" />
<rect class="fil6 str0" transform="matrix(0,-0.561483,0.438305,0,301.252,310.695)" width="48.9544" height="10.1988" />
<polygon class="fil0 str0" points="586.451,335.322 614.541,314.021 639.575,334.873 614.541,357.88 " transform="matrix(1,0,0,1,0,-39)" />
<rect class="fil6 str0" x="602.284" y="333.582" width="25.9272" height="4.73914" transform="matrix(1,0,0,1,0,-39)" />
<rect class="fil6 str0" transform="matrix(0,-0.561483,0.438305,0,613.0112,310.695)" width="48.9544" height="10.1988" />
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M613.904 364.256l-6.29174 8.91969 0 -9.70985 6.3 -9.70985 6.29174 9.70985 0 9.70985 -6.3 -8.91969zm-0.767717 85.5449l0 -86.3351 1.53543 0 0 86.3351 -1.53543 0z" />
</g>
<line class="fil0 str0" x1="515.974" y1="449.801" x2="613.904" y2="449.801" transform="matrix(1,0,0,1,0,-39)" />
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M470.578 250.583l-0.764174 0.764174 -17.8795 0 0 -1.52835 17.8795 0 0.764174 0.764174zm-0.764174 -0.764174l0.764174 0 0 0.764174 -0.764174 -0.764174zm0 20.4839l-0.764174 -0.764174 0 -18.9555 1.52835 0 0 18.9555 -0.764174 0.764174zm0.764174 -0.764174l0 0.764174 -0.764174 0 0.764174 -0.764174zm-19.4079 0l0.764174 -0.764174 17.8795 0 0 1.52835 -17.8795 0 -0.764174 -0.764174zm0.764174 0.764174l-0.764174 0 0 -0.764174 0.764174 0.764174zm0 -20.4839l0.764174 0.764174 0 18.9555 -1.52835 0 0 -18.9555 0.764174 -0.764174zm-0.764174 0.764174l0 -0.764174 0.764174 0 -0.764174 0.764174z" />
</g>
<a transform="matrix(1,0,0,1,0,-39)">
<line class="fil0 str2" x1="456.394" y1="260.06" x2="465.355" y2="260.06" transform="matrix(1,0,0,1,0,0) " />
<line class="fil0 str2" x1="460.862" y1="264.81" x2="460.862" y2="255.311" transform="matrix(1,0,0,1,0,0) " />
</a>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M471.639 473.676l-0.767717 0.767717 -17.8819 0 0 -1.53543 17.8819 0 0.767717 0.767717zm-0.767717 -0.767717l0.767717 0 0 0.767717 -0.767717 -0.767717zm0 20.4933l-0.767717 -0.767717 0 -18.9579 1.53543 0 0 18.9579 -0.767717 0.767717zm0.767717 -0.767717l0 0.767717 -0.767717 0 0.767717 -0.767717zm-19.4173 0l0.767717 -0.767717 17.8819 0 0 1.53543 -17.8819 0 -0.767717 -0.767717zm0.767717 0.767717l-0.767717 0 0 -0.767717 0.767717 0.767717zm0 -20.4933l0.767717 0.767717 0 18.9579 -1.53543 0 0 -18.9579 0.767717 -0.767717zm-0.767717 0.767717l0 -0.767717 0.767717 0 -0.767717 0.767717z" />
</g>
<g id="bfa7ffcc12f142a7e3ddae8ed90c87_l">
<line class="fil0 str2" x1="457.45" y1="483.154" x2="466.411" y2="483.154" transform="matrix(1,0,0,1,0,-39)" />
<line class="fil0 str2" x1="461.929" y1="487.904" x2="461.929" y2="478.405" transform="matrix(1,0,0,1,0,-39)" />
</g>
<rect class="fil0 str0" x="796.038" y="179.553" width="111.366" height="93.8476" rx="20.1969" ry="20.1969" transform="matrix(1,0,0,1,0,-39)" />
<a xlink:href="" transform="matrix(1,0,0,1,20,-19)">
<text id="bcjUMVEEeQ7" x="784" y="210" class="linkTextTitle">耗材销售流程</text>
</a>
<rect class="fil0 str0" x="794.392" y="402.953" width="111.366" height="93.8476" rx="20.1969" ry="20.1969" transform="matrix(1,0,0,1,0,-39)" />
<a xlink:href="" transform="matrix(1,0,0,1,20,-19)" id="bfa7ffcc12e554326431de8dfc4871">
<text x="780" y="420" class="linkTextTitle">设备耗材客户</text>
<text x="780" y="440" class="linkTextTitle">投诉处理流程</text>
</a>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M783.814 225.79l-8.91969 -6.29174 9.70985 0 9.70985 6.3 -9.70985 6.29174 -9.70985 0 8.91969 -6.3zm-76.6241 -0.767717l77.4142 0 0 1.53543 -77.4142 0 0 -1.53543z" />
</g>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M782.8 449.981l-8.91969 -6.29174 9.70985 0 9.70985 6.3 -9.70985 6.29174 -9.70985 0 8.91969 -6.3zm-75.6095 -0.767717l76.3997 0 0 1.53543 -76.3997 0 0 -1.53543z" />
</g>
<line class="fil0 str2" x1="707.191" y1="314.021" x2="707.191" y2="226.308" transform="matrix(1,0,0,1,0,-39)" />
<line class="fil0 str2" x1="707.191" y1="449.979" x2="707.191" y2="358.742" transform="matrix(1,0,0,1,0,-39)" />
<polygon class="fil0 str0" points="679.289,335.322 707.379,314.021 732.413,334.873 707.379,357.88 " transform="matrix(0.84,0,0,1,112.936,-39)" />
<rect class="fil6 str3" x="695.123" y="333.582" width="25.9272" height="4.73914" transform="matrix(1,0,0,1,0,-39)" />
<rect class="fil6 str0" transform="matrix(0,-0.561483,0.438305,0,705.8494,310.695)" width="48.9544" height="10.1988" />
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M860.378 249.784l-0.764174 0.767717 -17.8784 0 0 -1.53543 17.8784 0 0.764174 0.767717zm-0.764174 -0.767717l0.764174 0 0 0.767717 -0.764174 -0.767717zm0 20.4898l-0.764174 -0.767717 0 -18.9543 1.52835 0 0 18.9543 -0.764174 0.767717zm0.764174 -0.767717l0 0.767717 -0.764174 0 0.764174 -0.767717zm-19.4067 0l0.764174 -0.767717 17.8784 0 0 1.53543 -17.8784 0 -0.764174 -0.767717zm0.764174 0.767717l-0.764174 0 0 -0.767717 0.764174 0.767717zm0 -20.4898l0.764174 0.767717 0 18.9543 -1.52835 0 0 -18.9543 0.764174 -0.767717zm-0.764174 0.767717l0 -0.767717 0.764174 0 -0.764174 0.767717z" />
</g>
<g id="bcjUMVEEeQ7_l">
<line class="fil0 str2" x1="846.194" y1="259.263" x2="855.155" y2="259.263" transform="matrix(1,0,0,1,0,-39)" />
<line class="fil0 str2" x1="850.675" y1="264.012" x2="850.675" y2="254.512" transform="matrix(1,0,0,1,0,-39)" />
</g>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M860.665 474.623l-0.767717 0.764174 -17.8807 0 0 -1.52835 17.8807 0 0.767717 0.764174zm-0.767717 -0.764174l0.767717 0 0 0.764174 -0.767717 -0.764174zm0 20.4874l-0.767717 -0.764174 0 -18.9591 1.53543 0 0 18.9591 -0.767717 0.764174zm0.767717 -0.764174l0 0.764174 -0.767717 0 0.767717 -0.764174zm-19.4162 0l0.767717 -0.764174 17.8807 0 0 1.52835 -17.8807 0 -0.767717 -0.764174zm0.767717 0.764174l-0.767717 0 0 -0.764174 0.767717 0.764174zm0 -20.4874l0.767717 0.764174 0 18.9591 -1.53543 0 0 -18.9591 0.767717 -0.764174zm-0.767717 0.764174l0 -0.764174 0.767717 0 -0.767717 0.764174z" />
</g>
<g id="bfa7ffcc12e554326431de8dfc4871_l">
<line class="fil0 str2" x1="846.478" y1="484.102" x2="855.438" y2="484.102" transform="matrix(1,0,0,1,0,-39)" />
<line class="fil0 str2" x1="850.958" y1="488.852" x2="850.958" y2="479.352" transform="matrix(1,0,0,1,0,-39)" />
</g>
<g transform="matrix(1,0,0,1,0,-39)">
<path class="fil1" d="M914.813 449.981l8.91969 6.29174 -9.70985 0 -9.70985 -6.3 9.70985 -6.29174 9.70985 0 -8.91969 6.3zm49.4552 0.767717l-50.2453 0 0 -1.53543 50.2453 0 0 1.53543z" />
</g>
<line class="fil0 str0" x1="909.291" y1="225.788" x2="964.976" y2="225.788" transform="matrix(1,0,0,1,0,-39)" />
<line class="fil0 str0" x1="964.266" y1="449.979" x2="964.266" y2="225.788" transform="matrix(1,0,0,1,0,-39)" />
<a xlink:href="javascript:interval();"><text id="fJmKR9T5nsT_p" class="taskItem" x="70" y="396" transform="matrix(1,0,0,1,15,-39)">有<tspan id="fJmKR9T5nsT_t">(0)</tspan>条待办事项</text></a>
<a xlink:href="javascript:interval();"><text id="bfa7ffcc12f13b23b38fa7cf0bcb54_p" class="taskItem" x="70" y="396" transform="matrix(1,0,0,1,341,-148)">有<tspan id="bfa7ffcc12f13b23b38fa7cf0bcb54_t">(0)</tspan>条待办事项</text></a>
<a xlink:href="javascript:interval();"><text id="bcjUMVEEeQ7_p" class="taskItem" x="70" y="396" transform="matrix(1,0,0,1,733,-148)">有<tspan id="bcjUMVEEeQ7_t">(0)</tspan>条待办事项</text></a>
<a xlink:href="javascript:interval();"><text id="bfa7ffcc12f142a7e3ddae8ed90c87_p" class="taskItem" x="70" y="396" transform="matrix(1,0,0,1,339,76)">有<tspan id="bfa7ffcc12f142a7e3ddae8ed90c87_t">(0)</tspan>条待办事项</text></a>
<a xlink:href="javascript:interval();"><text id="bfa7ffcc12e554326431de8dfc4871_p" class="taskItem" x="70" y="396" transform="matrix(1,0,0,1,730,76)">有<tspan id="bfa7ffcc12e554326431de8dfc4871_t">(0)</tspan>条待办事项</text></a>
<rect id="bfa7ffcc12f13b23b38fa7cf0bcb54_r" x="331" y="259" width="252" height="102" fill="#FFFFCC" stroke="#FF9900" transform="matrix(1,0,0,1,0,-2)" visibility="hidden" />
<g id="bfa7ffcc12f13b23b38fa7cf0bcb54_g">
</g>
<rect id="bfa7ffcc12f142a7e3ddae8ed90c87_r" x="329" y="481" width="251" height="110" fill="#FFFFCC" stroke="#FF9900" transform="matrix(1,0,0,1,1,0)" visibility="hidden" />
<g id="bfa7ffcc12f142a7e3ddae8ed90c87_g">
</g>
<rect id="bcjUMVEEeQ7_r" x="733" y="255" width="226" height="105" fill="#FFFFCC" stroke="#FF9900" visibility="hidden" />
<g id="bcjUMVEEeQ7_g">
</g>
<rect id="bfa7ffcc12e554326431de8dfc4871_r" x="731" y="480" width="249" height="110" fill="#FFFFCC" stroke="#FF9900" visibility="hidden" />
<g id="bfa7ffcc12e554326431de8dfc4871_g">
</g>
<rect id="fJmKR9T5nsT_r" x="61" y="370" width="225" height="124" fill="#FFFFCC" stroke="#FF9900" stroke-opacity="1" visibility="hidden" />
<g id="fJmKR9T5nsT_g">
</g>
<rect class="fil0 str1" x="2.95095" y="110.39" width="1020" height="548.028" rx="25" ry="25" stroke-opacity="0.5" transform="matrix(1,0,0,0.988,-1,-56.427)" />
</svg>
/
json格式换行 java 使用gjson.jar处理更方便操作对象
/*
* $Id: JSONUtil.java 386 2011-05-11 13:29:55Z mk $
*
* Copyright (c) 2011 SHANGHAI NEWTECH FABRIC PRINTING LTD
* All Rights Reserved.
* Confidential and for internal use only.
*/
package com.bizatworktech.bizessence.in.tab.util;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import net.sf.json.JSONObject;
import com.bizatworktech.bizessence.cm.xc.BEException;
import com.bizatworktech.bizessence.in.eForm.form.EntityKey;
import com.bizatworktech.bizessence.in.eForm.form.QueryForm;
import com.bizatworktech.bizessence.in.kdAPI.monitor.IMonitorDelegator;
import com.bizatworktech.bizessence.in.kdAPI.query.impl.MnProcessQuery;
import com.bizatworktech.bizessence.in.kdAPI.query.impl.WorkToDoVo;
import com.bizatworktech.bizessence.in.svg.Process;
import com.bizatworktech.bizessence.in.svg.ProcessKo;
import com.bizatworktech.bizessence.in.svg.WorkToDo;
import com.bizatworktech.bizessence.rp.ac.bd.QtKiProcess;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
* 生成json格式工具类
*
* @author mk
* @version $Revision: 386 $
* @since 2.0
*/
public class JSONUtil
{
private static JSONUtil instance;
private JSONUtil()
{
}
public synchronized static JSONUtil getInstance()
{
if (instance == null)
{
instance = new JSONUtil();
}
return instance;
}
public String toJSONString(QueryForm qf)
throws UnsupportedEncodingException
{
EntityKey[] keys = qf.getKeys();
StringBuffer buf = new StringBuffer();
buf.append("{eForm:[");
for (EntityKey ek : keys)
{
buf.append("{id:\"").append(ek.getId()).append("\",").append(
"name:\"").append(ek.getName()).append("\",").append(
"isKW:\"").append(ek.isKW()).append("\",").append(
"value:\"").append(ek.getValue());
buf.append("\"}");
buf.append(",");
}
buf.append("]}");
String str = buf.toString();
int lastCommaIndex = str.lastIndexOf(",");
String json = str.substring(0, lastCommaIndex)
+ str.substring(lastCommaIndex + 1);
return java.net.URLEncoder.encode(json, "UTF-8");
}
/**
* 采用对象实现方式
*
* @param workToDoVoAllList
* 查询返回的有效的作业列表
* @param inputParam
* 请求参数作为查询列表的条件
* @return a string of JSONObject 输c出结果测试 {"耗材销售流程":{"count":1,
* "processSet":
* [{"workToDoSet":[{"id":"HC-销售流程-001_G4","name":"销售合同签订"}],
* "id":"HC-销售流程-001","name":"耗材销售流程"}],
* "id":"\"bcjUMVEEeQ7\"","name":"耗材销售流程"},
*
* "设备耗材客户投诉处理流程":{"count":1,
* "processSet":[{"workToDoSet":[{"id":"SB-HC-客户投诉处理-001_G2"
* ,"name":"填写客诉投诉单"}],
* "id":"SB-HC-客户投诉处理-001","name":"设备耗材客户投诉处理流程"}],
* "id":"\"bfa7ffcc12e554326431de8dfc4871\"",
* "name":"设备耗材客户投诉处理流程"},
*
* "设备销售流程":{"count":0, "processSet":[], "id":"\"fJmKR9T5nsT\"",
* "name":"设备销售流程"},
*
* "设备售后服务流程":{"count":3,
* "processSet":[{"workToDoSet":[{"id":"SB-售后服务-001_A3"
* ,"name":"流水线规划"}, {"id":"SB-售后服务-001_A4","name":"与客户确认基础培训计划"}],
* "id":"SB-售后服务-001","name":"设备售后服务流程"},
* {"workToDoSet":[{"id":"SB-售后服务-002_E1","name":"收到客户支付款项"}],
* "id":"SB-售后服务-002","name":"设备售后服务流程"}],
* "id":"\"bfa7ffcc12f13b23b38fa7cf0bcb54\"", "name":"设备售后服务流程"},
*
* "设备采购及安装流程":{"count":2,
* "processSet":[{"workToDoSet":[{"id":"mk-20120307001_A2"
* ,"name":"提供技术标准"}], "id":"mk-20120307001","name":"设备采购及安装流程"},
* {"workToDoSet":[{"id":"mk-20120306002_A2","name":"提供技术标准"}],
* "id":"mk-20120306002","name":"设备采购及安装流程"}],
* "id":"\"bfa7ffcc12f142a7e3ddae8ed90c87\"","name":"设备采购及安装流程"}}
*
*/
public String toJSONString(List<WorkToDoVo> workToDoVoAllList,
String inputParam)
{
Map<String, ProcessKo> koMap = getProcessKos(inputParam);
ProcessKo processKo = null;
Process process = null;
WorkToDo workItem = null;
for (WorkToDoVo work : workToDoVoAllList)
{
String processName = work.getProcessName();
String processId = work.getProcessId();
processKo = koMap.get(processName);
if (null == processKo)
continue;// 作业结果中没有该流程
else
{
workItem = new WorkToDo(work.getWorkId(), work.getWorkName());
if (null == process)
{
process = new Process(processId, processName);
updateKoMap(processKo, process, workItem);
}
else
{
if (process.getWorkToDoSet().contains(workItem))// 作业是否存在
continue;
if (process.getName().equals(processKo.getName()))
{// 相同KO的流程对象
if (!(processId.equals(process.getId())))
{// KO中的其他流程
process = new Process(processId, processName);
updateKoMap(processKo, process, workItem);
}
else
{ // 增加KO中的相同流程对象的作业
if (!process.getWorkToDoSet().contains(workItem))
process.getWorkToDoSet().add(workItem);
}
}
else
{// 存在的process 不是 当前KO
process = new Process(processId, processName);
updateKoMap(processKo, process, workItem);
}
}
processKo.setCount(processKo.getAllWorkToDo());
}
}
Gson gson = new Gson();
String json = gson.toJson(koMap);// koId会生成转义字符串'\"'? 影响客户端处理
int p = 0;
int start = 0;
StringBuffer sb = new StringBuffer();
while (-1 != (p = json.indexOf("\\", p)))
{
sb.append(json.substring(start, p));
start = p + 2;
p++;
}
sb.append(json.substring(start));
return sb.toString();
}
/**
* JSON格式的字符串转换为Map集合
*
* @param inputParam
* @return
*/
private Map<String, ProcessKo> getProcessKos(String inputParam)
{
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(inputParam);
JsonObject jo = je.getAsJsonObject();
Set<Entry<String, JsonElement>> set = jo.entrySet();
Map<String, ProcessKo> koMap = new HashMap<String, ProcessKo>();// 存放KO条件
for (Iterator<Entry<String, JsonElement>> iter = set.iterator(); iter
.hasNext();)
{
Entry<String, JsonElement> e = iter.next();
String processName = e.getKey();
String processKoId = e.getValue().toString();
koMap.put(processName, new ProcessKo(processKoId, processName));
}
return koMap;
}
private void updateKoMap(ProcessKo processKo, Process process,
WorkToDo workItem)
{
if (!processKo.getProcessSet().contains(process))
{
if (!process.getWorkToDoSet().contains(workItem))
{
HashSet<WorkToDo> workSet = new HashSet<WorkToDo>();
workSet.add(workItem);
process.setWorkToDoSet(workSet);// 流程对象增加作业
}
if (processKo.getProcessSet().isEmpty())
{
HashSet<Process> processSet = new HashSet<Process>();
processSet.add(process);// 流程集合对象增加流程
processKo.setProcessSet(processSet);// 流程KO增加流程对象集合
}
else
{
if (!processKo.getProcessSet().contains(process))
processKo.getProcessSet().add(process);
}
}
else
{
if (!process.getWorkToDoSet().contains(workItem))
process.getWorkToDoSet().add(workItem);
}
}
/**
* 采用集合实现方式
*
* @param workToDoVoAllList
* 接收所有待办事项
* @param names
* 流程名称
* @return
*/
public String toJSONString(List<WorkToDoVo> workToDoVoAllList,
String[] names)
{
Map<String, Map<String, String>> processToWorkMap = new HashMap<String, Map<String, String>>();// 接收流程名称映射待办事项
Map<String, String> workItemMap = null;
Map<String, Integer> processCountMap = null;
for (String name : names)
{
for (WorkToDoVo work : workToDoVoAllList)
{
String processName = work.getProcessName();
String processId = work.getProcessId();
if (name.equals(processName))
{
String workId = work.getWorkId();
String workName = work.getWorkName();
if (null != processToWorkMap.get(processName + "$"
+ processId))// 该流程已经存在待办事项,继续添加
processToWorkMap.get(processName + "$" + processId)
.put(workId, workName);
else
{
workItemMap = new HashMap<String, String>();
workItemMap.put(workId, workName);
processToWorkMap.put(processName + "$" + processId,
workItemMap);
}
}
}
// 方便客户端处理数据,流程名称(包含多个同名流程)对应个数保存起来
for (Iterator<String> iter = processToWorkMap.keySet().iterator(); iter
.hasNext();)
{
String key = iter.next();
String proName = null;
int p = key.indexOf("$");
if (-1 != p)
proName = key.substring(0, p);
if (name.equals(proName))
{
if (null == processCountMap)
processCountMap = new HashMap<String, Integer>();
int count = processToWorkMap.get(key).size();
if (null == processCountMap.get(name))
processCountMap.put(name, count);
else
{
count += processCountMap.get(name).intValue();
processCountMap.put(name, count);
}
}
}
}
String processCount = null;
String json = null;
if (null != processCountMap)
processCount = JSONObject.fromObject(processCountMap).toString();
if (null != processToWorkMap)
json = JSONObject.fromObject(processToWorkMap).toString();
json += "$" + processCount;
return json.toString();
}
@SuppressWarnings("unchecked")
public String toJSONString(IMonitorDelegator md, String koName,
String userId) throws BEException
{
Map<String, Integer> map = new HashMap<String, Integer>();// 接收作业ko
// 映射处理中的任务个数
QtKiProcess conditions = new QtKiProcess();
conditions.setName(koName);
conditions.setState(4);// 处理中
Object[] objs = md.getMnProcesses(conditions);// 已创建
conditions.setState(1);
Object[] objs2 = md.getMnProcesses(conditions);
List<MnProcessQuery> processList = new ArrayList<MnProcessQuery>();
if (((Integer) objs[0]).intValue() > 0)
processList.addAll((List<MnProcessQuery>) objs[1]);
if (((Integer) objs2[0]).intValue() > 0)
processList.addAll((List<MnProcessQuery>) objs2[1]);
if (null != processList)
{
for (MnProcessQuery process : processList)
{
if (userId.equals(process.getAssignee()))
{
Map<String, Integer> map2 = md.getProcessFoState(process
.getId());
if (null != map2)
{
for (Iterator<Entry<String, Integer>> iter = map2
.entrySet().iterator(); iter.hasNext();)
{
Entry<String, Integer> e = iter.next();
if (2 == e.getValue())// 处理中的作业
{
if (null == map.get(e.getKey()))
map.put(e.getKey(), 1);
else
map.put(e.getKey(), map.get(e.getKey())
.intValue() + 1);
}
}
}
}
}
}
String json = JSONUtil.getInstance().mapToJsonString(map);
return json;
}
/**
* Map 转换为json格式
*
* @param map
* @return
*/
public String mapToJsonString(Map<?, ?> map)
{
if (null != map)
return JSONObject.fromObject(map).toString();
return null;
}
public static void main(String[] args)
{
}
}