TC流程到各個節點的時候,需要對節點的相關人員發送短信進行通知。
在此之前,嘗試過直接調用dll文件實現發送短信,但是有個問題就是短信貓每小時最多大約發送600條短信。發送密集時,會出現“丟”短信的問題。
最後使用企業短信服務器來實現自動隊列和發送短信息。ITK部分只需要告訴短信服務器要發送給誰,發送什麼內容即可。
1. 調用服務器發送短信使用cmd。
格式爲SendSMS 1891156xxxx 短信內容
void send_sms(const char* nameStr, // 接受者名字
const char* numStr, // 接受者手機號
const char* process_name, // 流程的名稱
const char* parent_name // 節點的名稱
)
{
CString m_msgStr;
m_msgStr.Format("SendSms %s %s,您好!流程:[%s_%s]需要您處理!【PLM】",
numStr, nameStr, process_name, parent_name);
// 發送信息給控制檯
WinExec(m_msgStr, SW_HIDE);
}
/*********************************************************************************
【功 能】: 發送短信給任務想過人員
【異 常】:
【設 計】: max
【注意事項】:
【建立時間】: 2012年12月建立
【額外說明】:
*********************************************************************************/
int C3_JC_Send_SMS(EPM_action_message_t msg)
{
int ifail = ITK_ok;
char *err_string;
int err_line = -1;
tag_t job_tag = NULLTAG;
tag_t task_tag = NULLTAG;
tag_t root_task = NULLTAG;
tag_t* SignOffs = NULLTAG;
int SignOffcount=0;
int i;
tag_t member = NULLTAG;
tag_t user = NULLTAG;
date_t dicdate;
SIGNOFF_TYPE_t type;
char nameStr[SA_person_name_size_c+1]={'\0'};
char* numStr = NULL;
tag_t person_tag=NULLTAG;
char* process_name = NULL;
char* task_name = NULL;
/*********************begin防止進入循環陷阱*******************/
task_tag = msg.task;
if( task_tag==NULL_TAG )
return ITK_ok;
if ( msg.action > EPM_perform_action )
{
return ITK_ok;
}
/*********************end防止進入循環陷阱*******************/
/***********獲取流程目標對象*****************/
CALL(EPM_ask_job( msg.task, &job_tag ));
CALL(EPM_ask_root_task(job_tag,&root_task));
/***************獲取籤審成員***************/
CALL(EPM_ask_attachments(task_tag,EPM_signoff_attachment,&SignOffcount,&SignOffs));
if (0 == SignOffcount){
/***************不存在籤審成員則找責任人***************/
CALL(EPM_ask_responsible_party(task_tag,&user));
CALL(SA_ask_user_person(user,&person_tag));
CALL(SA_ask_person_name(person_tag,nameStr));
CALL(SA_ask_person_attr(person_tag,"PA10",&numStr));
if((NULL != numStr)&&(tc_strcmp(numStr, "")))
{
CALL(AOM_ask_value_string(task_tag, "job_name", &process_name));
CALL(AOM_ask_value_string(task_tag, "object_name", &task_name));
// 發送短信
send_sms(nameStr, numStr, process_name, task_name);
MEM_free_s(process_name);
MEM_free_s(task_name);
MEM_free_s(numStr);
}else
printf("\n%s的%s手機號碼爲空", nameStr, numStr);
}else{
/*遍歷籤審成員*/
for(i=0;i<SignOffcount;i++)
{
CALL(EPM_ask_signoff_member(SignOffs[i],&member,&type));
if(SIGNOFF_GROUPMEMBER == type)
{
CALL(SA_ask_groupmember_user(member,&user));
CALL(SA_ask_user_person(user,&person_tag));
CALL(SA_ask_person_name(person_tag,nameStr));
CALL(SA_ask_person_attr(person_tag,"PA10",&numStr));
if((NULL != numStr)&&(tc_strcmp(numStr, "")))
{
CALL(AOM_ask_value_string(task_tag, "job_name", &process_name));
CALL(AOM_ask_value_string(task_tag, "parent_name", &task_name));
// 發送短信
send_sms(nameStr, numStr, process_name, task_name);
MEM_free_s(process_name);
MEM_free_s(task_name);
MEM_free_s(numStr);
}else
printf("\n%s的%s手機號碼爲空", nameStr, numStr);
}
}
SAFE_SM_FREE(SignOffs);
}
printf("\n");
/***********SMS*****************/
return ifail;
}
3. 在TC中配置該ACTION HANDLER
do節點
審覈節點