/*=================================================================================================== Copyright(c) 2011 Siemens PLM Software Corp. All rights reserved. Unpublished - All rights reserved ==================================================================================================== File description: Filename : epm_autosign_hander.cpp This file describes action handler function : PLA8-signoff 将流程签审信息写入表单 ==================================================================================================== Date Name Description of Change 19-Jan-2013 Ray Li creation $HISTORY$ ==================================================================================================*/ #pragma warning (disable: 4996) #pragma warning (disable: 4819) /** * @headerfile tcua 头文件 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * @headerfile standard c & cpp header files */ #include #include #include //#include //#include #include #include #include #include #include #include using namespace std; /** * @headerfile user's header files */ #include "epm_handler_common.h" #include "error_handling.h" #include "common_itk_util.h" #include "string_utils.h" #include "epm_sign_rev.h" //流程节点信息 struct FLOWNODEINFOS { char taskname[128]; char username[128]; char timeinfo[128]; char group[128]; }flownode_s[64]; //参数人员信息 struct USERINFOS { char taskname[128]; char propertyname[128]; char group[128]; }userinfo_s[64]; //参数日期信息 struct TIMEINFOS { char taskname[128]; char propertyname[128]; char group[128]; }timeinfo_s[64]; ////会签信息 //struct SIGNCOUNTERINFO //{ // char taskname[128]; // char group[128]; // char propertyname[128]; //}counter_s[64]; int nodecount = 0; int userinfoscount = 0; int timeinfoscount = 0; typedef struct{ string TaskUserName; string TaskTimeName; string UserName; string TimeStr; string GroupName; string PropUserName; string PropTimeName; }NOTICE_NODE; //int counterinfocount = 0; #define DOFREE(obj) \ { \ if(obj) \ { \ MEM_free(obj); \ obj = NULL; \ } \ } //struct SIGN_INFO_STRUCT //{ // string userid; // string username; // string taskname; // string signdate; //}; //struct SIGN_PROPS_STRUCT //{ // string taskname; // string propname; //}; //struct SIGN_TIME_STRUCT //{ // string taskname; // string propname; //}; extern "C" int POM_AM__set_application_bypass(logical bypass); int ORIGIN_ask_sign_info(tag_t task_node, char *output_str,char *task_name,char *arg3value) { int ifail = ITK_ok; tag_t cur_perform_task = NULLTAG,tempTask = NULLTAG; char cur_task_name[WSO_name_size_c+1]="",buf[128] = ""; //编制判断变量 int s = 0; EPM_decision_t decision = EPM_nogo; char* userName; char *timeinfo1 = "",person_name[SA_name_size_c+1]="",*prop_name = "last_mod_date"; tag_t aUserTag = NULLTAG,responsibleParty = NULLTAG; date_t decision_date; //其他节点相关 int perform_count = 0; int *attach_type; tag_t *perform_attaches = NULLTAG; tag_t memberTag = NULLTAG; SIGNOFF_TYPE_t memberType; CR_signoff_decision_t signoff_decision; char comments[CR_comment_size_c+1],*timeinfo="",*group_full_name = NULL; tag_t user_tag=NULLTAG, group_tag = NULLTAG; //循环判断变量 int i=0; EPM_ask_name( task_node, cur_task_name ) ; ECHO("cur_task_name = %s\n",cur_task_name); if ( stricmp( cur_task_name, "perform-signoffs" ) == 0 ) { cur_perform_task = task_node; //得到父节点 EPM_ask_parent_task( cur_perform_task, &tempTask ); EPM_ask_name( tempTask, cur_task_name ); } else if( strcmp( cur_task_name, "编制" ) == 0 || strcmp( cur_task_name, "设计" ) == 0) { cur_perform_task = task_node; } else { EPM_ask_sub_task(task_node, "perform-signoffs", &cur_perform_task) ; if ( cur_perform_task != NULLTAG ) { EPM_ask_name( task_node, cur_task_name ); ECHO( "---------> cur_task_name = %s\n" , cur_task_name ); } } if(cur_perform_task != NULLTAG ) { if( strcmp( cur_task_name, "编制" ) == 0||strcmp( cur_task_name, "设计" ) == 0 ) { tag_t owner = NULLTAG; ECHO("task_name=%s\n",task_name); s = EPM_ask_responsible_party(cur_perform_task,&responsibleParty); if(responsibleParty != NULLTAG) { decision = EPM_go; } AOM_ask_owner( cur_perform_task, &owner); //s = POM_get_user(&userName,&aUserTag); if( owner != NULLTAG ) SA_ask_user_person_name(owner, person_name); ECHO("person_name=%s\n",person_name); strcat(output_str, cur_task_name); strcat(output_str, "="); strcat(output_str, person_name); strcat(output_str, "|"); strcat(output_str, cur_task_name); strcat(output_str, "日期="); AOM_ask_value_date(cur_perform_task,prop_name,&decision_date); DATE_date_to_string(decision_date,arg3value,&timeinfo1); ECHO("\n-------\ntimeinfo 111 : %s\n------------\n",timeinfo1); //ITK_date_to_string (decision_date, &timeinfo1); 2017.11.23 编制时间覆盖掉了,注掉 strcat( output_str, timeinfo1 ); strcat(output_str,"|"); ECHO("timeinfo : %s",timeinfo1); strcpy(flownode_s[nodecount].taskname,cur_task_name); strcpy(flownode_s[nodecount].username,person_name); strcpy(flownode_s[nodecount].timeinfo,timeinfo1); nodecount = nodecount + 1; //MEM_free(userName); } else { //发起人即所有者 tag_t owner = NULLTAG; date_t date; logical is_valid; char *d_value = NULL; AOM_ask_owner( cur_perform_task, &owner); if( owner != NULLTAG ) SA_ask_user_person_name(owner, person_name); AOM_ask_value_date(cur_perform_task,"creation_date", &date);//fnd0StartDate DATE_date_to_string(date,arg3value,&d_value); //ITKCALL(AOM_UIF_ask_value( cur_perform_task, "fnd0StartDate", &d_value)); ECHO("d_value : %s",d_value); strcat(output_str, "设计"); strcat(output_str, "="); strcat(output_str, person_name); strcat(output_str, "|"); strcat(output_str, "设计日期="); //CALL(DATE_date_to_string(date,arg3value,&timeinfo)); //ITKCALL(DATE_string_to_date_t(d_value, &is_valid,&date)); //CALL(DATE_date_to_string(date,arg3value,&timeinfo)); //ECHO("timeinfo : %s",timeinfo); //vector ans; //if( d_value != NULL ) //{ // Split(d_value, ' ', ans); // if(ans.size() > 1) // strcat(output_str,ans[0].c_str()); //} strcat(output_str,d_value); //DOFREE(timeinfo); strcat(output_str, "|"); strcpy(flownode_s[nodecount].taskname,"设计"); strcpy(flownode_s[nodecount].username,person_name); //if(ans.size() > 1) strcpy(flownode_s[nodecount].timeinfo,d_value); nodecount = nodecount + 1; ECHO("output_str=%s",output_str); EPM_ask_all_attachments(cur_perform_task,&perform_count,&perform_attaches,&attach_type); ECHO("EPM_signoff_attachment Counts = %d", perform_count); for(i=0;i 0) { for (i=0;i type_vec; //Split(exclude_type,";",type_vec); ECHO("参数1个数:%d\n",userinfoscount); ECHO("参数2个数:%d\n",timeinfoscount); //得到触发handler的节点 msg.task; //通过节点获取根流程 EPM_ask_root_task( msg.task, &root_task ); //得到根流程下的所有的一级节点 EPM_ask_sub_tasks( root_task, &sub_task_count, &sub_tasks); //得到根流程的名称 EPM_ask_name( root_task, root_task_name ); // ECHO("root_task_name=%s\n",root_task_name); EPM_ask_name( current_task, task_name ); ECHO( "sub_task_count = %d\n", sub_task_count ); //test========================== //tag_t user = NULLTAG, *tasks = NULL; //int n_task= 0; //ITKCALL(SA_find_user( "admin", &user )); //ITKCALL(SA_ask_user_work_contexts ( user, &n_task, &tasks)); //ECHO("==========n_task=%d",n_task); //============================== //单独处理DO节点 if(strcmp(task_name,"编制") == 0||strcmp(task_name,"设计") == 0) { ECHO("task_name:%s",task_name); //获取责任人 s = EPM_ask_responsible_party(current_task,&responsibleParty); if(responsibleParty != NULLTAG) { decision = EPM_go; } //获取当前的用户 s = POM_get_user(&userName,&aUserTag); //获取personname SA_ask_user_person_name(aUserTag,person_name); strcat(sign_info,task_name); strcat(sign_info,"="); strcat(sign_info,person_name); strcat(sign_info,"|"); strcat(sign_info,task_name); strcat(sign_info,"日期="); //POM_ask_v //获取对象的时间属性,参数1,对象,参数2,属性名称,属性3,获取到的时间属性值 AOM_ask_value_date(current_task,prop_name,&decision_date); //AOM_UIF_ask_value(current_task,prop_name, &timeinfo2); //将时间结构体转换成为某种时间格式的字符串 DATE_date_to_string(decision_date,arg3value,&timeinfo2); ECHO("\n--------------\n timeinfo2=%s\n------------\n",timeinfo2); strcat(sign_info,timeinfo2); strcat(sign_info,"|"); strcpy(flownode_s[nodecount].taskname,task_name); strcpy(flownode_s[nodecount].username,person_name); strcpy(flownode_s[nodecount].timeinfo,timeinfo2); nodecount = nodecount + 1; } else //perform节点 { for(i=0;i0 ){ char * schdule_task_node_type = NULL; AOM_ask_value_string(schdule_task_nodes[0],"object_type",&schdule_task_node_type); if(strcmp(schdule_task_node_type,"ScheduleTask")==0){ tag_t schdule = NULL_TAG; date_t finish_date ; AOM_ask_value_tag(schdule_task_nodes[0],"schedule_tag",&schdule); AOM_ask_value_date(schdule_task_nodes[0],"finish_date",&finish_date); char finish_date_str[300] = ""; if(schdule != NULL_TAG){ char * schdule_name = NULL; AOM_ask_value_string(schdule,"object_name",&schdule_name); sprintf(finish_date_str,"%s[%d年%d月%d日]",schdule_name,finish_date.year,finish_date.month+1,finish_date.day); AOM_lock(tast_tag); AOM_set_value_string(tast_tag,"object_name",finish_date_str); printf("设置属性\n"); AOM_save(tast_tag); AOM_unlock(tast_tag); AOM_refresh(tast_tag,0); if(schdule_name !=NULL){ MEM_free(schdule_name); schdule_name = NULL; } } } if(schdule_task_node_type !=NULL){ MEM_free(schdule_task_node_type); schdule_task_node_type = NULL; } } if(task_name != NULL){ MEM_free(task_name); task_name = NULL; } if(schdule_task_nodes != NULL){ MEM_free(schdule_task_nodes); schdule_task_nodes = NULL; } } printf("关超级权限\n"); POM_AM__set_application_bypass(false); printf("===================================\n"); printf("设置时间表名称 结束\n"); printf("===================================\n"); return ifail; } /** * * Description: * This handler will set signoff infomation to properties of form * * Syntax: * jf-sign-tongzhi [-debug=true|false] * * -SignUserName: 编制=c7Formation;设计=c7Design;审核=c7Review * * -SignDate: 编制=c7Formationtime;校对=c7DesignTime;审核=c7ReviewTime * * -SignDateFormate: %Y-%m-%d * * -bypass * * -include_type 需要签名的表单类型 * */ int tm_sign_tongzhi(EPM_action_message_t msg) { printf("======================================================\n"); printf("开始通知节点签名\n"); printf("======================================================\n"); int ifail = ITK_ok ; //参数相关 char arg1value[1024] = "",arg2value[1024] = "",arg3value[1024]="",arg4value[1024]="", signcounter_info[1024] = "",include_type[1024]=""; char *argflag =NULL,*argvalue=NULL ,*arg = NULL; BOOL setboth = TRUE ,bypass; int arg_cnt = 0; //流程节点相关 tag_t root_task = NULLTAG ,current_task = NULLTAG,type_tag = NULLTAG; char tgt_type[WSO_name_size_c+1]="",type_class[TCTYPE_class_name_size_c+1]=""; tag_t cur_task = NULLTAG; char task_type[WSO_name_size_c+1] = ""; int i=0, j=0, k=0, count = 0, n = 0; tag_t itemrevision = NULLTAG,master_form_rel_type = NULLTAG; int form_count = 0; tag_t *form_list = NULL,master_form = NULLTAG; char *prop_name="last_mod_date"; current_task = msg.task; arg_cnt = TC_number_of_arguments(msg.arguments); ECHO("参数个数为:%d\n",arg_cnt); if (arg_cnt > 0) { for (i=0;i include_type_vec; vector signoff_name_info; vector signoff_time_info; vector notice_node_vec; Split(include_type,";",include_type_vec); Split(arg1value,";",signoff_name_info); Split(arg2value,";",signoff_time_info); if(signoff_name_info.size() != signoff_time_info.size()){ printf("签名异常结束\n"); return 0; } for(i = 0 ;i < signoff_name_info.size();i++){ vector name_sub_vec; vector tiem_sub_vec; Split(signoff_name_info[i],"=",name_sub_vec); Split(signoff_time_info[i],"=",tiem_sub_vec); if(name_sub_vec.size()==2 && tiem_sub_vec.size() ==2 ){ NOTICE_NODE node ; node.TaskTimeName.assign(tiem_sub_vec[0]); node.TaskUserName.assign(name_sub_vec[0]); node.PropTimeName.assign(tiem_sub_vec[1]); node.PropUserName.assign(name_sub_vec[1]); notice_node_vec.push_back(node); } name_sub_vec.clear(); tiem_sub_vec.clear(); } ITKCALL( EPM_ask_root_task( msg.task, &root_task ) ); int valid_signoffs_count = 0; tag_t * valid_signoffs_tags = NULL; ITKCALL(AOM_ask_value_tags(msg.task,"valid_signoffs",&valid_signoffs_count,&valid_signoffs_tags)); if(valid_signoffs_count !=0){ for(int ii = 0 ;ii < valid_signoffs_count;ii++){ date_t decision_date ; char * decision_str = NULL; char * assign_user_name = NULL; char * group_name = NULL; char * role_name = NULL; char * timeinfo1 = NULL; char * o_group_name = NULL; tag_t assign_user = NULL_TAG; tag_t assign_goup_mem = NULL_TAG; tag_t role_tag = NULL_TAG; tag_t o_group_tag = NULL_TAG; //获取时间 AOM_ask_value_date(valid_signoffs_tags[ii],"decision_date",&decision_date); //完成情况 AOM_UIF_ask_value(valid_signoffs_tags[ii],"decision",&decision_str); //通知人 AOM_ask_value_tag(valid_signoffs_tags[ii],"fnd0Assignee",&assign_user); if(assign_user!=NULL_TAG){ AOM_UIF_ask_value(assign_user,"user_name",&assign_user_name); } //通知人所在的组 ITKCALL(AOM_ask_value_tag(valid_signoffs_tags[ii],"group_member",&assign_goup_mem)); if(assign_goup_mem!=NULL_TAG){ AOM_UIF_ask_value(assign_goup_mem,"object_name",&group_name); //role_tag AOM_ask_value_tag(assign_goup_mem,"role",&role_tag); if(role_tag!= NULL_TAG){ AOM_UIF_ask_value(role_tag,"object_name",&role_name); } AOM_ask_value_tag(assign_goup_mem,"group",&o_group_tag); if(role_tag!= NULL_TAG){ AOM_UIF_ask_value(o_group_tag,"name",&o_group_name); } } DATE_date_to_string(decision_date,arg3value,&timeinfo1); printf("通知人:[%s] 组织:[%s] 角色:[%s] 时间:[%d-%d-%d] 状态:[%s]\n",assign_user_name,o_group_name,role_name,decision_date.year,decision_date.month,decision_date.day,decision_str); BOOL is_used = FALSE; for( i = 0 ;i < notice_node_vec.size();i++){ //string sign_task_name; //sign_task_name.assign(notice_node_vec[i].TaskUserName.c_str()); //string temp_task_name; //temp_task_name.assign(group_name); if(strcmp(role_name,notice_node_vec[i].TaskUserName.c_str())==0){ printf("role_name = %s / TaskUserName = %s \n",role_name,notice_node_vec[i].TaskUserName.c_str()); notice_node_vec[i].UserName.assign(assign_user_name); notice_node_vec[i].TimeStr.assign(timeinfo1); is_used = TRUE; break; }else if(strcmp(o_group_name,notice_node_vec[i].TaskUserName.c_str())==0){ printf("group_name=%s / TaskUserName = %s \n",o_group_name,notice_node_vec[i].TaskUserName.c_str()); notice_node_vec[i].UserName.assign(assign_user_name); notice_node_vec[i].TimeStr.assign(timeinfo1); is_used = TRUE; break; }else{ printf("Other Group / TaskUserName = %s\n",notice_node_vec[i].TaskUserName.c_str()); } } if(!is_used) for( i = 0 ;i < notice_node_vec.size();i++){ if(strcmp(notice_node_vec[i].TaskUserName.c_str(),"工程技术中心")==0){ printf("group =工程技术中心 / TaskUserName = %s \n",notice_node_vec[i].TaskUserName.c_str()); notice_node_vec[i].UserName.assign(assign_user_name); notice_node_vec[i].TimeStr.assign(timeinfo1); break; } } if(decision_str!=NULL){ MEM_free(decision_str); decision_str = NULL; } if(assign_user_name!=NULL){ MEM_free(assign_user_name); assign_user_name = NULL; } if(group_name!=NULL){ MEM_free(group_name); group_name = NULL; } if(role_name!=NULL){ MEM_free(role_name); role_name = NULL; } if(timeinfo1!=NULL){ MEM_free(timeinfo1); timeinfo1 = NULL; } if(o_group_name!=NULL){ MEM_free(o_group_name); o_group_name = NULL; } } } int occur_of_counts = 0; tag_t * taskAttches =NULL; ECHO("the node number is %d",nodecount); if(current_task != NULLTAG) { EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &taskAttches); ECHO("%d target attachment found",occur_of_counts); for( count=0; count