This is my server method.
I sometimes get the error method.
Please help me.
Thank you.
/*****************************************************************
* Date:
* Author:
* MethodName:ATEN_CFC_COMMON_SUBMIT
* Purpose:送出簽核(參數=pathName,comments,formID,signOff;
成功回傳1,其餘任何回傳或未回傳皆為簽核失敗)
版本20:加入判斷isCheckOverride如果為觀察者override設0
加入代理人判斷功能 -20190315 Bryantwu
*****************************************************************/
//System.Diagnostics.Debugger.Break();
Innovator innovator = this.getInnovator();
ArasTool aras = new ArasTool(innovator);
StringBuilder body = new StringBuilder("");
string yyyymmdd = DateTime.Now.ToString("yyyyMMdd");
string methodName = "ATEN_CFC_COMMON_SUBMIT";
//接參數
string pathName = this.getProperty("pathName");
string comments = this.getProperty("comments");
string formID = this.getProperty("formID");
string signOff = this.getProperty("signOff");
string isCheckOverride = this.getProperty("isCheckOverride");
//取Workflow
Item wfItem = this.newItem("Workflow","get");
wfItem.setProperty("source_id",formID);
wfItem = wfItem.apply();
//取文件號碼
string typeName = aras.getTypeNameByWorkflow(wfItem);
Item fItem = this.newItem(typeName,"get");
fItem.setProperty("id",formID);
fItem = fItem.apply();
string formNumber = fItem.getProperty("_number");
if(wfItem.isError()){
return innovator.newResult(wfItem.getErrorString());
} else {
bool isSignoffBy = false;
//取登入者Identity ID
string loginUser = innovator.getUserID();
Item userIden = aras.getIdentityFromUserByID(loginUser);
string loginUserIden = userIden.getProperty("id");
//取Activity
Item act = aras.getActivityByFormItem(fItem);
//取Activity Assignment
Item actAssigns = this.newItem("Activity Assignment","get");
Item actAssign = this.newItem("Activity Assignment","get");
actAssigns.setProperty("source_id",act.getID());
actAssigns.setPropertyCondition("closed_by", "is null");
//BRYANT
actAssigns.setProperty("for_all_members","0");
actAssigns = actAssigns.apply();
string actAssignID = "";
for(int j=0; j<actAssigns.getItemCount(); j++){
if(isSignoffBy) break;
//取簽核者Identity
actAssign = actAssigns.getItemByIndex(j);
actAssignID = actAssign.getID();
string signoffUser = actAssign.getProperty("related_id");
string isAlias = aras.isPersonIdentityByID(signoffUser);
//加入代理人判斷功能 -20190315 Bryantwu
string para="<LoginUser>"+loginUserIden+"</LoginUser><Assignment>"+signoffUser+"</Assignment><FormItemName>"+typeName+"</FormItemName>";
string isAgent = innovator.applyMethod("ATEN_Check_Agent",para).getResult();
//若為群組則判斷是否為成員
if("0".Equals(isAlias)){
string isChild = aras.isChildrenIdentityByID(signoffUser,loginUserIden);
if("1".Equals(isChild) || isAgent.Equals("1")){
isSignoffBy = true;
}
} else {
if(signoffUser.Equals(loginUserIden) || isAgent.Equals("1")){
isSignoffBy = true;
}
// //test
// if(signoffUser.Equals(loginUserIden)){
// isSignoffBy = true;
// }
}
}//for
if(!isSignoffBy){
return innovator.newResult(aras.getLanguageText("flow.NotAssignment")); //您目前非簽核者!
} else {
if("Approve".Equals(signOff) || "Reject".Equals(signOff) || "Cancel".Equals(signOff)){
if(String.IsNullOrEmpty(pathName)){
pathName = signOff;
}
}else {
return innovator.newResult(aras.getLanguageText("flow.SigningError")+aras.getLanguageText("flow.ErrorSignOpinion")); //簽核錯誤:簽核意見有誤
}
string pathID = aras.getPathIDByActivity(act, pathName);
if(String.IsNullOrEmpty(pathID)){
return innovator.newResult(aras.getLanguageText("flow.SigningError")+pathName+aras.getLanguageText("flow.NoPathID")+act.getID()); //簽核錯誤:XXX無法取得PathID!XXX
} else {
if(isCheckOverride.Equals("Y")){
//設定Path Override狀態簽核者才需override。 簽核者:voting_weight>=1 觀察者:voting_weight=0 2018/1/15
if(pathName=="Reject" && actAssign.getProperty("voting_weight")=="0"){
setPath(pathName,act,"0");
}
else if(pathName=="Reject" && actAssign.getProperty("voting_weight")!="0"){
setPath(pathName,act,"1");
}
}
body.Append("<AML>");
body.Append("<Item type='").Append(act.getAttribute("type")).Append("' action='EvaluateActivity'>");
body.Append("<Activity>").Append(act.getID()).Append("</Activity>");
body.Append("<ActivityAssignment>").Append(actAssign.getID()).Append("</ActivityAssignment>");
body.Append("<Paths>");
body.Append("<Path id='").Append(pathID).Append("'><![CDATA['").Append(pathName).Append("']]></Path>");
body.Append("</Paths>");
body.Append("<DelegateTo></DelegateTo>");
body.Append("<Tasks></Tasks>");
body.Append("<Variables></Variables>");
body.Append("<Authentication mode=''></Authentication>");
body.Append("<Comments>").Append(comments).Append("</Comments>");
body.Append("<Complete>1</Complete>");
body.Append("</Item></AML>");
int count = 0;
int maxTries = 3;
while(true) {
try {
CCO.Utilities.WriteDebug("log_"+yyyymmdd, formNumber + ":Start applyAML");
CCO.Utilities.WriteDebug("log_"+yyyymmdd, formNumber + ":XML=>" + body.ToString());
Item res = innovator.applyAML(body.ToString());
CCO.Utilities.WriteDebug("log_"+yyyymmdd, formNumber + ":End applyAML");
if (res.isError()) {
CCO.Utilities.WriteDebug("log_"+yyyymmdd, formNumber + ":" + res.getErrorString());
return innovator.newResult(formNumber + ":" + res.getErrorString());
} else {
return innovator.newResult("1");
}
} catch (Exception e) {
// handle exception
if (++count == maxTries) {
CCO.Utilities.WriteDebug("log_"+yyyymmdd,"Retry Time(" + count.ToString() + ")");
CCO.Utilities.WriteDebug("log_"+yyyymmdd,"送簽錯誤" + methodName+" 表單號碼:"+formNumber+" 執行XML:"+body.ToString()+"\r\n錯誤訊息:"+e.ToString());
return innovator.newError(""); //前端顯示 送簽異常-請聯絡系統管理員(Error)!! 用newError停止流程往下走
};
CCO.Utilities.WriteDebug("log_"+yyyymmdd,"Retry Time(" + count.ToString() + ")");
}
}
}
}
//return innovator.newResult(formNumber + ":Error");
}
}
private void setPath(string pathName,Item act,string type)
{
Item qry = this.newItem("Workflow Process Path","get");
qry.setAttribute("select","id");
qry.setProperty("source_id",act.getID());
qry.setAttribute("orderBy", "created_on DESC");
qry.setProperty("name",pathName);
qry = qry.apply();
if (qry.isError())
{
throw new Exception(qry.getErrorString());
}
Item path = qry.getItemByIndex(0);
path.setAction("edit");
path.setProperty("is_override",type);
path = path.apply();
if (path.isError())
{
throw new Exception(path.getErrorString());
}