流程权限的配置(远程)

This commit is contained in:
liuz 2018-07-27 19:20:11 +08:00
parent c5e4d8a6e0
commit 45c591ea61
2 changed files with 284 additions and 250 deletions

View File

@ -1,196 +1,204 @@
<%@page import="com.amarsoft.are.jbo.ql.Parser"%>
<%@page import="com.amarsoft.biz.workflow.*"%>
<%@page import="com.amarsoft.app.flow.*"%>
<%@page import="com.tenwa.flow.task.*"%>
<%@page import="com.amarsoft.are.lang.StringX"%>
<%@include file="/Frame/resources/include/include_begin.jspf"%>
<%@include file="/Tenwa/Core/FlowManager/BaseFunction/BaseFlowListFunction.jspf" %>
<%@page contentType="text/html; charset=GBK"%>
<%
String taskNo = CurPage.getParameter("TaskNo");
String applyType = CurPage.getParameter("applyType");
String phasename = CurPage.getParameter("phasename");
if(StringX.isSpace(taskNo)) taskNo = "";
if(StringX.isSpace(applyType)) applyType = "";
if(StringX.isSpace(phasename)) phasename = "";
String userID = CurUser.getUserID();
JBOTransaction tx = JBOFactory.createJBOTransaction();
TenwaFlowTask ft = new TenwaFlowTask(taskNo, tx);//使用jboTrans
String routeInfo=ft.getFlowRebackInfo();
String flowNo = ft.FlowNo;
String phaseNo=ft.PhaseNo;
String objectNo=ft.ObjectNo;
String flowState = ft.FlowState;
//会签历史纪录阶段号问题
tx.commit();
%>
<style>
.opinion-style{
width:100%;
overflow:hidden;
display:inline-block;
margin-bottom:2px;
outline:none;
}
.opinion-style2{
overflow:hidden;
display:inline-block;
margin-bottom:2px;
outline:none;
}
a.opinion-style:hover{
background-color:A8CAE5;
outline:none;
}
.opinion-focus{
background-color:A8CAE5;
}
</style>
<div>
<table>
<tr>
<td width="50%" align="right"><%=new Button("提交","确认提交","javascript:backMethod();","","btn_icon_Submit","").getHtmlText()%></td>
<td width="50%" align="center"><%=new Button("放弃","放弃提交","javascript:doCancel();","","btn_icon_delete","").getHtmlText()%></td>
</tr>
</table>
</div>
<div id="opinionset">
<div style="margin-top:10px;margin-left:15px;font-size:12px;">
<font color="#000000"><b>请选择退回后提交方式:</b></font>
</div>
<div style="margin-top:10px;margin-left:10px;font-size:12px;border:1px solid lightgray;padding:10px;">
<input id="directsubmit" type="radio" name="backmethod" value="1"/>直接提交退回步骤
<input id="stepapprove" type="radio" name="backmethod" value="2" />逐级审批
</div>
<div style="margin-top:10px;margin-left:15px;font-size:12px;">
<font color="#000000"><b>请选择退回路径:</b></font>
</div>
<div id="stepInfo" style="margin-top:10px;margin-left:10px;font-size:12px;border:1px solid lightgray;padding:10px;">
</div>
<div style="height:300px; overflow:auto">
<div id="actionset">
</div>
<div id="actionreadset">
</div>
</div>
<div>
<table width="100%" align="center">
<tr>
<td align="center"><b><span id="phaseinfo" style="color: #FF0000" ></span></b></td>
</tr>
</table>
</div>
<script type="text/javascript">
var strRouteJson='<%=routeInfo%>';
var routeJson= JSON.parse(strRouteJson);
var taskNo = "<%=taskNo%>";
var applyType = "<%=applyType%>";
var phasename = "<%=phasename%>";
var userID = "<%=userID%>";
var objectNo = "<%=objectNo%>";
$(function(){initRouteInfo();});
function initRouteInfo(){
//初始请选择退回后提交方式
var backnexttype=routeJson.backnexttype;
if(backnexttype.length==0){
$("#stepapprove").attr("checked",true);
}else{
if(backnexttype=="backnextperson"){
$("#directsubmit").attr("checked",true);
$("#stepapprove").attr("disabled",true);
$("#directsubmit").attr("disabled",true);
}else if(backnexttype=="backnextstep"){
$("#stepapprove").attr("checked",true);
$("#stepapprove").attr("disabled",true);
$("#directsubmit").attr("disabled",true);
}
}
var stepInfo=$("#stepInfo");
if(routeJson.backstept.length>0){
for(var i=0;i<routeJson.backstept.length;i++){
var phaseNo=routeJson.backstept[i].phaseNo;
var phaseName=routeJson.backstept[i].phaseName;
stepInfo.append("<a class='opinion-style2' href='javascript:void(0)' ><input type='radio' name='phaseopinion' onclick='initFlowUserInfo(\""+phaseNo+"\")' value='" +phaseNo+ "' >" + phaseName+ "("+phaseNo+")</input></a><br>");
}
if(routeJson.backstept.length==1){
$("input[name='phaseopinion']:first").attr("checked",true);
initFlowUserInfo(routeJson.backstept[0].phaseNo);
}
}else{
stepInfo.append("没有可退回的步骤");
}
}
//初始化路由下面的用户
function initFlowUserInfo(tempphaseno){
var backUserInfo = AsControl.RunJavaMethodTrans("com.amarsoft.app.flow.FlowAction", "getBackStepTaskInfo", "objectNo=<%=objectNo%>,phaseNo="+tempphaseno);
var actionSet = $("#actionset");
var cindex=0;
var selectUser=$('#phaseaction'+cindex).text()||"";
if(selectUser.length==0){
actionSet.append("<div style='margin-top:10px;margin-left:15px;font-size:12px;'><font color='#000000'><b>退回的用户:</b></font></div><div id='phaseaction"+cindex+"' style='margin-top:10px;margin-left:10px;font-size:12px;border:1px solid lightgray;padding:5px;'></div>");
}else{
$('#phaseaction'+cindex).html("");
}
var phaseAction = $("#phaseaction"+cindex);
if(backUserInfo!=null){
var userJson= backUserInfo;
var username= userJson.userName||"";
if(username.length>0){
phaseAction.append("<a class='opinion-style' style='width:100' href='javascript:void(0)' ><input type='radio' name='phaseaction"+cindex+"' checked value='"+userJson.taskNo+"'>"+userJson.userName+"</input></a>");
}else{
phaseAction.append("无用户");
}
}
}
function doCancel(){
if(confirm("您确定要放弃此次提交吗?")){
parent.AsDialog.ClosePage("_CANCEL_");
}
}
function backMethod(){
if(document.getElementById("stepapprove").checked){
commitAction();
}else if(document.getElementById("directsubmit").checked){
commitAction('recommit');
}else{
alert("请选择退回后提交方式!");
}
}
//提交动作
function commitAction(isRecommit){
var isCommited = AsControl.RunJavaMethodTrans("com.amarsoft.app.flow.FlowAction", "isCommited", "TaskNo=<%=taskNo%>");
if(isCommited=='yes'){
alert("此流程任务已提交!");
return;
}
var sTaskNo = $("input[name='phaseaction0']:checked").val()||"";
var returnUser = $("input[name='phaseaction0']:checked")[0].nextSibling.nodeValue||"";
if(typeof(sTaskNo)=="undefined" || sTaskNo.length==0){
alert(getMessageText('AWEW1001'));//请选择一条信息!
return;
}
if(confirm("确定退回吗?")){
var para="";
if(typeof(isRecommit)!=undefined && isRecommit=="recommit"){
para = ",Recommit=Y";
}
var msg = RunJavaMethodTrans("com.amarsoft.app.flow.FlowAction","returnTask","TaskNo=<%=taskNo%>,ReturnPoint="+sTaskNo+para);
var sFlowLogContent="<%=CurUser.getUserName()%>在@退回流程给"+returnUser;
insertFlowLog(objectNo,taskNo,sFlowLogContent);
alert("操作成功")
parent.AsDialog.ClosePage("_SUCCESS_");
}
}
</script>
<%@include file="/Frame/resources/include/include_end.jspf"%>
<%@page import="com.amarsoft.are.jbo.ql.Parser"%>
<%@page import="com.amarsoft.biz.workflow.*"%>
<%@page import="com.amarsoft.app.flow.*"%>
<%@page import="com.tenwa.flow.task.*"%>
<%@page import="com.amarsoft.are.lang.StringX"%>
<%@include file="/Frame/resources/include/include_begin.jspf"%>
<%@include file="/Tenwa/Core/FlowManager/BaseFunction/BaseFlowListFunction.jspf" %>
<%@page contentType="text/html; charset=GBK"%>
<%
String taskNo = CurPage.getParameter("TaskNo");
String applyType = CurPage.getParameter("applyType");
String phasename = CurPage.getParameter("phasename");
if(StringX.isSpace(taskNo)) taskNo = "";
if(StringX.isSpace(applyType)) applyType = "";
if(StringX.isSpace(phasename)) phasename = "";
String userID = CurUser.getUserID();
JBOTransaction tx = JBOFactory.createJBOTransaction();
TenwaFlowTask ft = new TenwaFlowTask(taskNo, tx);//使用jboTrans
String routeInfo=ft.getFlowRebackInfo();
String flowNo = ft.FlowNo;
String phaseNo=ft.PhaseNo;
String objectNo=ft.ObjectNo;
String flowState = ft.FlowState;
//会签历史纪录阶段号问题
tx.commit();
%>
<style>
.opinion-style{
width:100%;
overflow:hidden;
display:inline-block;
margin-bottom:2px;
outline:none;
}
.opinion-style2{
overflow:hidden;
display:inline-block;
margin-bottom:2px;
outline:none;
}
a.opinion-style:hover{
background-color:A8CAE5;
outline:none;
}
.opinion-focus{
background-color:A8CAE5;
}
</style>
<div>
<table>
<tr>
<td width="50%" align="right"><%=new Button("提交","确认提交","javascript:backMethod();","","btn_icon_Submit","").getHtmlText()%></td>
<td width="50%" align="center"><%=new Button("放弃","放弃提交","javascript:doCancel();","","btn_icon_delete","").getHtmlText()%></td>
</tr>
</table>
</div>
<div id="opinionset">
<div style="margin-top:10px;margin-left:15px;font-size:12px;">
<font color="#000000"><b>请选择退回后提交方式:</b></font>
</div>
<div style="margin-top:10px;margin-left:10px;font-size:12px;border:1px solid lightgray;padding:10px;">
<input id="directsubmit" type="radio" name="backmethod" value="1"/>直接提交退回步骤
<input id="stepapprove" type="radio" name="backmethod" value="2" />逐级审批
</div>
<div style="margin-top:10px;margin-left:15px;font-size:12px;">
<font color="#000000"><b>请选择退回路径:</b></font>
</div>
<div id="stepInfo" style="margin-top:10px;margin-left:10px;font-size:12px;border:1px solid lightgray;padding:10px;">
</div>
<div style="height:300px; overflow:auto">
<div id="actionset">
</div>
<div id="actionreadset">
</div>
</div>
<div>
<table width="100%" align="center">
<tr>
<td align="center"><b><span id="phaseinfo" style="color: #FF0000" ></span></b></td>
</tr>
</table>
</div>
<script type="text/javascript">
var strRouteJson='<%=routeInfo%>';
var routeJson= JSON.parse(strRouteJson);
var taskNo = "<%=taskNo%>";
var applyType = "<%=applyType%>";
var phasename = "<%=phasename%>";
var userID = "<%=userID%>";
var objectNo = "<%=objectNo%>";
$(function(){initRouteInfo();});
function initRouteInfo(){
//初始请选择退回后提交方式
var backnexttype=routeJson.backnexttype;
if(backnexttype.length==0){
$("#stepapprove").attr("checked",true);
}else{
if(backnexttype=="backnextperson"){
$("#directsubmit").attr("checked",true);
$("#stepapprove").attr("disabled",true);
$("#directsubmit").attr("disabled",true);
}else if(backnexttype=="backnextstep"){
$("#stepapprove").attr("checked",true);
$("#stepapprove").attr("disabled",true);
$("#directsubmit").attr("disabled",true);
}
}
var stepInfo=$("#stepInfo");
if(routeJson.backstept.length>0){
stepInfo.append("<table>");
for(var i=0;i<routeJson.backstept.length;i++){
var phaseNo=routeJson.backstept[i].phaseNo;
var phaseName=routeJson.backstept[i].phaseName;
if(i==0){stepInfo.append("<tr>");}else{if(i%3==0){stepInfo.append("</tr><tr>");}}
stepInfo.append("<td><a class='opinion-style2' href='javascript:void(0)' ><input type='radio' name='phaseopinion' onclick='initFlowUserInfo(\""+phaseNo+"\")' value='" +phaseNo+ "' >" + phaseName+ "("+phaseNo+")</input></a></td>");
if(i==(routeJson.backstept.length-1)){stepInfo.append("</tr>");}
}
stepInfo.append("</table>");
if(routeJson.backstept.length==1){
$("input[name='phaseopinion']:first").attr("checked",true);
initFlowUserInfo(routeJson.backstept[0].phaseNo);
}
}else{
stepInfo.append("没有可退回的步骤");
}
}
//初始化路由下面的用户
function initFlowUserInfo(tempphaseno){
var backUserInfo = AsControl.RunJavaMethodTrans("com.amarsoft.app.flow.FlowAction", "getBackStepTaskInfo", "objectNo=<%=objectNo%>,phaseNo="+tempphaseno);
var actionSet = $("#actionset");
var cindex=0;
var selectUser=$('#phaseaction'+cindex).text()||"";
if(selectUser.length==0){
actionSet.append("<div style='margin-top:10px;margin-left:15px;font-size:12px;'><font color='#000000'><b>退回的用户:</b></font></div><div id='phaseaction"+cindex+"' style='margin-top:10px;margin-left:10px;font-size:12px;border:1px solid lightgray;padding:5px;'></div>");
}else{
$('#phaseaction'+cindex).html("");
}
var phaseAction = $("#phaseaction"+cindex);
if(backUserInfo!=null){
var userJson= backUserInfo;
var username= userJson.userName||"";
if(username.length>0){
phaseAction.append("<a class='opinion-style' style='width:100' href='javascript:void(0)' ><input type='radio' name='phaseaction"+cindex+"' checked value='"+userJson.taskNo+"'>"+userJson.userName+"</input></a>");
}else{
phaseAction.append("无用户");
}
}
}
function doCancel(){
if(confirm("您确定要放弃此次提交吗?")){
parent.AsDialog.ClosePage("_CANCEL_");
}
}
function backMethod(){
if(document.getElementById("stepapprove").checked){
commitAction();
}else if(document.getElementById("directsubmit").checked){
commitAction('recommit');
}else{
alert("请选择退回后提交方式!");
}
}
//提交动作
function commitAction(isRecommit){
var isCommited = AsControl.RunJavaMethodTrans("com.amarsoft.app.flow.FlowAction", "isCommited", "TaskNo=<%=taskNo%>");
if(isCommited=='yes'){
var message = AsControl.RunJavaMethodTrans("com.amarsoft.app.flow.FlowAction","getTaskAutoColseInfo","taskNo=<%=taskNo%>");
if(message!=""){
alert("操作失败:"+message+"!");
}else{
alert("此流程任务已提交!");
}
}
var sTaskNo = $("input[name='phaseaction0']:checked").val()||"";
var returnUser = $("input[name='phaseaction0']:checked")[0].nextSibling.nodeValue||"";
if(typeof(sTaskNo)=="undefined" || sTaskNo.length==0){
alert(getMessageText('AWEW1001'));//请选择一条信息!
return;
}
if(confirm("确定退回吗?")){
var para="";
if(typeof(isRecommit)!=undefined && isRecommit=="recommit"){
para = ",Recommit=Y";
}
var msg = RunJavaMethodTrans("com.amarsoft.app.flow.FlowAction","returnTask","TaskNo=<%=taskNo%>,ReturnPoint="+sTaskNo+para);
var sFlowLogContent="<%=CurUser.getUserName()%>在@退回流程给"+returnUser;
insertFlowLog(objectNo,taskNo,sFlowLogContent);
alert("操作成功")
parent.AsDialog.ClosePage("_SUCCESS_");
}
}
</script>
<%@include file="/Frame/resources/include/include_end.jspf"%>

View File

@ -1,12 +1,11 @@
package com.tenwa.flow.task;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jbo.sys.FLOW_MODEL;
import jbo.sys.FLOW_TASK;
import com.alibaba.fastjson.JSON;
import com.amarsoft.amarscript.Any;
import com.amarsoft.amarscript.ELContext;
import com.amarsoft.amarscript.Expression;
@ -19,9 +18,13 @@ import com.amarsoft.are.util.json.JSONDecoder;
import com.amarsoft.are.util.json.JSONObject;
import com.amarsoft.biz.workflow.FlowTask;
import com.amarsoft.context.ASUser;
import com.tenwa.comm.util.jboutil.DataOperatorUtil;
import com.tenwa.flow.service.FlowUserManageServie;
import com.tenwa.flow.service.FlowUserManageServieImp;
import jbo.sys.FLOW_MODEL;
import jbo.sys.FLOW_TASK;
public class TenwaFlowTask extends FlowTask {
public JBOTransaction baseTrans = null;
@ -395,69 +398,92 @@ public class TenwaFlowTask extends FlowTask {
* @throws Exception
*/
public String getFlowRebackInfo() throws Exception {
BizObjectManager bm = JBOFactory.getBizObjectManager(
FLOW_MODEL.CLASS_NAME, this.baseTrans);
BizObject bo = bm.createQuery("flowno=:flowno and phaseno=:phaseno")
.setParameter("flowno", this.FlowNo)
.setParameter("phaseno", this.PhaseNo).getSingleResult(false);
String backnexttype = bo.getAttribute("BACKSTEPNEXTTYPE").getString();
if (backnexttype == "") {
backnexttype = "";
}
String backSteps = bo.getAttribute("BACKSTEPS").getString();
String returnMessage = "{\"backnexttype\":\"" + backnexttype
+ "\",\"backstept\":[";
Map<String, Object> resultJson = new HashMap<String, Object>();
BizObjectManager bm = JBOFactory.getBizObjectManager(FLOW_MODEL.CLASS_NAME, this.baseTrans);
BizObject bo = bm.createQuery("flowno=:flowno and phaseno=:phaseno").setParameter("flowno", this.FlowNo).setParameter("phaseno", this.PhaseNo).getSingleResult(false);
String backnexttype = bo.getAttribute("BACKSTEPNEXTTYPE").getString();// backnextCust
String backSteps = bo.getAttribute("BACKSTEPS").getString();// 01申请人发起(0010)
List<Map<String, String>> backStepList = new ArrayList<Map<String, String>>();
resultJson.put("backnexttype", backnexttype);
resultJson.put("backstept", backStepList);
String fixedSteps = "";
if (backSteps.length() > 1) {
if (backSteps != null && backSteps.length() > 1) {
fixedSteps = this.getBackStepsByConfig(backSteps);
}
String sql = "";
Map<String,String>condition=new HashMap<String,String>();
if (backSteps.length() <= 1) {
sql = " SELECT O.phaseno,O.phasename FROM O left join jbo.sys.FLOW_MODEL fm on o.phaseno=fm.phaseno and o.flowno=fm.flowno WHERE o.flowno=:flowno and o.objectno='"
+ this.ObjectNo + "' ";
sql += "AND O.phaseno<'"
+ this.PhaseNo
+ "' and fm.ATTRIBUTE7='01' order by O.phaseno DESC,begintime desc";
//没有判断退回路径时
if(this.ForkState.equals("INFORK")){
//第一种并行中退回
sql="select o.phaseno,o.phasename from (";
sql=sql+ " SELECT * FROM flow_task START WITH serialno =:serialno CONNECT BY PRIOR relativeserialno = serialno ";
sql=sql+" )o left join FLOW_MODEL fm on o.phaseno=fm.phaseno and o.flowno=fm.flowno where to_number(fm.phaseno)<to_number('" + this.PhaseNo + "') and (nvl(o.forkstate,'e') <>'INFORK' OR (nvl(o.forkstate,'e') ='INFORK' and forkno=:forkno) )and fm.ATTRIBUTE7='01' order by begintime";
condition.put("serialno", this.RelativeSerialNo);
condition.put("forkno", this.ForkNo);
}else{
//第二种一般路径不能退回并行中
sql="select o.phaseno,o.phasename from ( ";
sql=sql+" SELECT * FROM flow_task START WITH serialno =:serialno CONNECT BY PRIOR relativeserialno = serialno ";
sql=sql+" )o left join FLOW_MODEL fm on o.phaseno=fm.phaseno and o.flowno=fm.flowno where to_number(fm.phaseno)<to_number('" + this.PhaseNo + "') and nvl(o.forkstate,'e') <>'INFORK' and fm.ATTRIBUTE7='01' order by begintime";
condition.put("serialno", this.RelativeSerialNo);
}
} else {
sql = " SELECT O.phaseno,O.phasename FROM O WHERE o.flowno=:flowno and o.objectno='"
+ this.ObjectNo + "' ";
sql += "AND O.phaseno in (" + fixedSteps
+ ") order by O.phaseno DESC,begintime desc";
sql = " SELECT O.phaseno,O.phasename FROM flow_task O WHERE o.flowno=:flowno and o.objectno=:objectno ";
sql += "AND O.phaseno in (" + fixedSteps + ") order by O.phaseno DESC,begintime desc";
condition.put("flowno", this.FlowNo);
condition.put("objectno", this.ObjectNo);
}
List<BizObject> bos = JBOFactory
.getBizObjectManager(FLOW_TASK.CLASS_NAME, this.baseTrans)
.createQuery(sql).setParameter("flowno", this.FlowNo)
.getResultList(false);
if (backSteps.length() == 0) {
// ¼ÓÔØÍË»ØÉÏÒ»²½
returnMessage += "{\"phaseNo\":\""
+ bos.get(0).getAttribute("phaseno").getString()
+ "\",\"phaseName\":\""
+ bos.get(0).getAttribute("phasename").getString() + "\"}";
} else {
List<Map<String,String>>bos= DataOperatorUtil.getDataBySql(this.baseTrans,sql,condition);
BizObjectManager taskManages = JBOFactory.getBizObjectManager(FLOW_TASK.CLASS_NAME, this.baseTrans);
if(bos.size() == 0 && this.RelativeSerialNo != null) {
BizObject fromTask = null;
if(this.AssignedTaskNo.length() > 0) {
BizObjectQuery fromQuery = taskManages.createQuery("o.flowno=:flowno and o.objectno=:objectno and o.flowstate in ('START','NORMAL') and o.phaseopinion1=:phaseopinion1");
fromQuery.setParameter("flowno", this.FlowNo);
fromQuery.setParameter("objectno", this.ObjectNo);
fromQuery.setParameter("phaseopinion1", this.PhaseNo);
List<BizObject> result = fromQuery.getResultList(false);
if (result.size() > 0) {
fromTask = result.get(0);
}
}
if(fromTask == null) {
BizObjectQuery fromQuery = taskManages.createQuery("o.SerialNo=:SerialNo and o.objectno=:objectno");
fromQuery.setParameter("SerialNo", this.RelativeSerialNo);
fromQuery.setParameter("objectno", this.ObjectNo);
fromTask = fromQuery.getSingleResult(false);
}
if(fromTask != null) {
Map<String, String> step = new HashMap<String, String>();
step.put("phaseNo", fromTask.getAttribute("phaseno").getString());
step.put("phaseName", fromTask.getAttribute("phasename").getString());
backStepList.add(step);
}
}
// else if (backSteps.length() == 0) {
// // 加载退回上一步
// Map<String, String> step = new HashMap<String, String>();
// step.put("phaseNo", bos.get(0).getAttribute("phaseno").getString());
// step.put("phaseName", bos.get(0).getAttribute("phasename").getString());
// backStepList.add(step);
// }
else {
Map<String, String> tasks = new HashMap<String, String>();
int findex = 0;
for (int i = 0; i < bos.size(); i++) {
if (!tasks.containsKey(bos.get(i).getAttribute("phaseno")
.getString())) {
findex++;
if (findex > 1) {
returnMessage += ",";
}
tasks.put(bos.get(i).getAttribute("phaseno").getString(),
"");
returnMessage += "{\"phaseNo\":\""
+ bos.get(i).getAttribute("phaseno").getString()
+ "\",\"phaseName\":\""
+ bos.get(i).getAttribute("phasename").getString()
+ "\"}";
if (!tasks.containsKey(bos.get(i).get("PHASENO"))) {
tasks.put(bos.get(i).get("PHASENO"), "");
Map<String, String> step = new HashMap<String, String>();
step.put("phaseNo", bos.get(i).get("PHASENO"));
step.put("phaseName", bos.get(i).get("PHASENAME"));
backStepList.add(step);
}
}
}
returnMessage += "]}";
return returnMessage;
return JSON.toJSONString(resultJson);
}