#include "wf_custom.h" #include "tccore\iman_msg.h" extern "C" int POM_AM__set_application_bypass(logical bypass); int len(char *p) { int i=0; while(*p++)i++; return i; } void split(char *src,const char *separator,char **dest,int *num) { /* src 源字符串的首地址(buf的地址) separator 指定的分割字符 dest 接收子字符串的数组 num 分割后子字符串的个数 */ char *pNext; int count = 0; if (src == NULL || strlen(src) == 0) //如果传入的地址为空或长度为0,直接终止 return; if (separator == NULL || strlen(separator) == 0) //如未指定分割的字符串,直接终止 return; pNext = (char *)strtok(src,separator); //必须使用(char *)进行强制类型转换(虽然不写有的编译器中不会出现指针错误) while(pNext != NULL) { *dest++ = pNext; ++count; pNext = (char *)strtok(NULL,separator); //必须使用(char *)进行强制类型转换 } *num = count; } int Connor_set_bypass(void *returnValue) { POM_AM__set_application_bypass(true); return 0; } int Connor_close_bypass(void *returnValue) { POM_AM__set_application_bypass(false); return 0; } /** * bypass */ int Connor_bypass(EPM_action_message_t msg){ ECHO("==================bypass START =======================\n"); int ifail = ITK_ok, arg_cnt; char *argflag =NULL,*argvalue=NULL ,*arg = NULL; int i=0, j=0; BOOL bypass = FALSE; arg_cnt = TC_number_of_arguments(msg.arguments); ECHO("参数个数为:%d\n",arg_cnt); POM_AM__set_application_bypass(true); if (arg_cnt > 0) { for (i=0;i0 ){ char * schdule_task_node_type = NULL; AOM_ask_value_string(schdule_task_nodes[0],"object_type",&schdule_task_node_type); char * scheduleTaskName =NULL; char finish_date_str[300] = ""; printf("object_type:%s\n",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_string(schdule_task_nodes[0], "object_name", &scheduleTaskName); printf("scheduleTaskName:%s\n",scheduleTaskName); if(schdule != NULL_TAG){ //char * schdule_name = NULL; char * job_name = NULL; char * project_id = NULL; char * project_name = NULL; //date_t time; //char * d_value=NULL; int num=0; tag_t * projects; //AOM_ask_value_date(schdule_task_nodes[0],"finish_date", &time); //DATE_date_to_string(time,"%Y-%m-%d",&d_value); EPM_ask_job(tast_tag, &job); AOM_ask_value_string(job,"object_name",&job_name); //AOM_ask_value_string(schdule,"object_name",&schdule_name); AOM_ask_value_tags(schdule,"project_list",&num,&projects); //printf("shcedule_name:%s\n",schdule_name); //sprintf(finish_date_str,"%s-%s-%s",schdule_name,scheduleTaskName,d_value); if (num>0) { AOM_ask_value_string(projects[0],"project_id",&project_id); AOM_ask_value_string(projects[0],"object_name",&project_name); sprintf(finish_date_str,"%s-%s-%s",scheduleTaskName,project_id,project_name); }else { sprintf(finish_date_str,"%s-%s-%s",scheduleTaskName,"",""); } AOM_lock(job); AOM_set_value_string(job,"object_name",finish_date_str); printf("str:%s\n",finish_date_str); printf("设置属性\n"); AOM_save(job); AOM_unlock(job); if(job_name !=NULL){ MEM_free(job_name); job_name = NULL; } if(project_id !=NULL){ MEM_free(project_id); project_id = NULL; } if(project_name !=NULL){ MEM_free(project_name); project_name = NULL; } /*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; } int WF_schedule_has_baseline(EPM_rule_message_t msg){ printf("===================================\n"); printf("根据时间表是否基线,限制流程发起 开始\n"); printf("===================================\n"); int ifail = EPM_go,att_cnt=0; tag_t task_tag = NULL_TAG, root_task_tag=NULLTAG, *attachments=NULLTAG;; task_tag = msg.task; char err[1024]="\0"; if(task_tag == NULLTAG) { return EPM_nogo; } EPM_ask_root_task(task_tag, &root_task_tag); EPM_ask_attachments(root_task_tag, EPM_target_attachment, &att_cnt, &attachments); if(att_cnt<=0){ printf("目标为空 退出\n"); return EPM_nogo; }else{ for (int i = 0; i < att_cnt; i++) { tag_t tagt=NULLTAG,tag_tags=NULLTAG; char *type=NULL,*name=NULL,*item_id=NULL; tagt=attachments[i];// ITKCALL(AOM_ask_value_string(tagt,"object_type",&type)); ITKCALL(AOM_ask_value_string(tagt,"object_name",&name)); printf("对象类型:%s\n",type); if ((strcmp(type,"Schedule") == 0)){ printf("对象类型符合,继续\n"); }else{ printf("对象类型不符合\n"); ifail=EPM_nogo; sprintf(err,"对象%s不是时间表,无法执行流程!!",name); break; } ITKCALL(AOM_ask_value_tag(tagt,"activeschbaseline_tag",&tag_tags));//活动的基线 if(tag_tags==NULLTAG){ printf("未找到基线,不能执行\n"); ifail=EPM_nogo; sprintf(err,"时间表%s不存在基线,请基线后再执行该流程!!",name); continue; } if(type!=NULL){ MEM_free(type); type = NULL; } if(name!=NULL){ MEM_free(name); name = NULL; } } printf("2222ifail:%d\n",ifail); } if(strcmp(err, "") != 0){ ifail=EPM_nogo; printf("错误:%s\n",err); EMH_store_error_s1(EMH_severity_information,278701,err);//错误弹窗 } printf("ifail:%d\n",ifail); printf("===================================\n"); printf("根据时间表是否基线,限制流程发起 结束\n"); printf("===================================\n"); return ifail; } //设置文档的项目相关属性 //参数:-type 值:Document int WF_set_project_prop(EPM_action_message_t msg){ printf("===================================\n"); printf("设置文档的项目相关属性 开始\n"); printf("===================================\n"); int ifail = ITK_ok; int att_cnt=0,isas=0; tag_t task_tag = NULLTAG, root_task_tag=NULLTAG, *attachments=NULL; vector type_vec; char arg1value[1024] = ""; char *argflag =NULL,*argvalue=NULL ,*arg = NULL; int arg_cnt = 0; int arg_col=0; //获取handler的参数的个数 arg_cnt = TC_number_of_arguments(msg.arguments); ECHO("参数个数为:%d\n",arg_cnt); if (arg_cnt > 0) { for (int i=0;i0){ for (int i = 0; i < att_cnt; i++) { tag_t tagt=NULLTAG,*tag_tags=NULL; char* type=NULL; int tag_col=0; ITKCALL(AOM_ask_value_string(attachments[i],"object_type",&type)); printf("对象类型:%s\n",type); if (strcmp(type,"Folder")==0) { int doc_num=0; tag_t *doc_tags=NULL; ITKCALL(AOM_ask_value_tags(attachments[i],"contents",&doc_num,&doc_tags)); for (int j = 0; j < doc_num; j++) { tagt=doc_tags[j]; boolean istype=false; for (int t = 0; t < type_vec.size(); t++) { char typevalue[64] = ""; strcpy(typevalue,type_vec[t].c_str()); int is=checkIsTypeOrSubtype(tagt,typevalue); if(is==1){ printf("类型符合\n"); istype=true; break; } } printf("111\n"); if (istype) { printf("222\n"); int numtask=0,numpro=0; tag_t *tasks=NULL,*pro_tags=NULL; tag_t schedule_tag; ITKCALL(AOM_ask_value_tags(root_task_tag,"fnd0RootScheduleTask",&numtask,&tasks)); printf("任务数量:%d\n",numtask); if (numtask>0) { ITKCALL(AOM_ask_value_tag(tasks[0],"schedule_tag",&schedule_tag)); ITKCALL(AOM_ask_value_tags(schedule_tag,"project_list",&numpro,&pro_tags)); printf("项目数量:%d\n",numpro); if (numpro>0) { tag_t rev_tagt; ITKCALL(ITEM_ask_latest_rev(tagt,&rev_tagt));//获得最新版本 char * proname=NULL, *proid=NULL ,*khmc=NULL; ITKCALL(AOM_ask_value_string(pro_tags[0],"object_name",&proname)); ITKCALL(AOM_ask_value_string(pro_tags[0],"project_id",&proid)); ITKCALL(AOM_ask_value_string(pro_tags[0],"wf2_customerName",&khmc)); printf("项目名称:%s\n",proname); printf("项目id:%s\n",proid); printf("客户名称:%s\n",khmc); ITKCALL(AOM_lock(rev_tagt)); ITKCALL(AOM_set_value_string(rev_tagt,"wf2_projectName",proname)); ITKCALL(AOM_set_value_string(rev_tagt,"wf2_projectNumber",proid)); ITKCALL(AOM_set_value_string(rev_tagt,"wf2_customerName",khmc)); ITKCALL(AOM_save(rev_tagt)); ITKCALL(AOM_unlock(rev_tagt)); if(proname !=NULL){ MEM_free(proname); proname = NULL; } if(proid !=NULL){ MEM_free(proid); proid = NULL; } }else{ printf("指定时间表找不到项目!"); } } if(tasks !=NULL){ MEM_free(tasks); tasks = NULL; } if(pro_tags !=NULL){ MEM_free(pro_tags); pro_tags = NULL; } } } } if(tag_tags !=NULL){ MEM_free(tag_tags); tag_tags = NULL; } if(type !=NULL){ MEM_free(type); type = NULL; } } } if(attachments !=NULL){ MEM_free(attachments); attachments = NULL; } printf("关超级权限\n"); POM_AM__set_application_bypass(false); printf("===================================\n"); printf("设置文档的项目相关属性 结束\n"); printf("===================================\n"); return ifail; } int WF_project_has_folder(EPM_rule_message_t msg){ printf("===================================\n"); printf("项目交付物检查 开始\n"); printf("===================================\n"); int ifail = EPM_go; int att_cnt=0; tag_t task_tag = NULLTAG, root_task_tag=NULLTAG, *attachments=NULL; char err[1024]="\0"; task_tag = msg.task; EPM_ask_root_task(task_tag, &root_task_tag); EPM_ask_attachments(root_task_tag, EPM_target_attachment, &att_cnt, &attachments); if(att_cnt>0){ for (int i = 0; i < att_cnt; i++) { tag_t tagt=NULLTAG; char* type=NULL; int tag_col=0; ITKCALL(AOM_ask_value_string(attachments[i],"object_type",&type)); printf("对象类型:%s\n",type); if (strcmp(type,"Folder")==0) { int doc_num=0; tag_t *doc_tags=NULL; ITKCALL(AOM_ask_value_tags(attachments[i],"contents",&doc_num,&doc_tags)); if(doc_num>0) { int num = 0; tag_t *num_tags = NULL; tag_t rev_tagt; for (int j = 0; j < doc_num; j++) { tagt = doc_tags[j]; int is=checkIsTypeOrSubtype(tagt,"Item"); if(is == 1){ ITKCALL(ITEM_ask_latest_rev(tagt,&rev_tagt)); }else{ ifail = EPM_nogo; sprintf(err,"上传对象不是Item对象,请重新上传!!"); } ITKCALL(AOM_ask_value_tags(rev_tagt,"release_status_list",&num,&num_tags)); if(num == 0) { ifail = EPM_nogo; sprintf(err,"交付物对象版本没有发布,请发布!!"); } } if(num_tags !=NULL){ MEM_free(num_tags); num_tags = NULL; } }else{ ifail = EPM_nogo; sprintf(err,"交付物文件夹为空,请上传交付物对象!!"); } if(doc_tags !=NULL){ MEM_free(doc_tags); doc_tags = NULL; } } if(type !=NULL){ MEM_free(type); type = NULL; } } } if(attachments !=NULL){ MEM_free(attachments); attachments = NULL; } if(strcmp(err, "") != 0){ ifail=EPM_nogo; printf("错误:%s\n",err); EMH_store_error_s1(EMH_severity_information,278701,err);//错误弹窗 } return ifail; } int BOM_CHI_ISRELEASE(EPM_rule_message_t msg){ printf("===================================\n"); printf("根据BOM子件是否发布,限制流程发起 开始\n"); printf("===================================\n"); int ifail = EPM_go,att_cnt=0; tag_t task_tag = NULL_TAG, root_task_tag=NULLTAG, *attachments;; task_tag = msg.task; char errs[2500]="\0"; char err[2000]="\0"; if(task_tag == NULLTAG) { return EPM_nogo; } EPM_ask_root_task(task_tag, &root_task_tag); EPM_ask_attachments(root_task_tag, EPM_target_attachment, &att_cnt, &attachments); if(att_cnt<=0){ printf("目标为空 退出\n"); return EPM_go; }else{ POM_AM__set_application_bypass(true); for (int i = 0; i < att_cnt; i++) { tag_t tagt=NULLTAG; char *name=NULL; int form_c=0; tagt=attachments[i];// if (checkIsTypeOrSubtype(tagt,"PSBOMViewRevision")!=1) { printf("类型不是PSBOMViewRevision\n"); continue; } printf("类型是PSBOMViewRevision,继续\n"); ITKCALL(AOM_ask_value_string(tagt,"object_string",&name)); int m=0,c_line_count = 0; tag_t bom_window_tag = NULLTAG, top_line_tag = NULLTAG, *c_line_tags; ITKCALL(BOM_create_window(&bom_window_tag));//创建window视图 ITKCALL(BOM_set_window_top_line_bvr(bom_window_tag,tagt,&top_line_tag));//获取顶层bomline ITKCALL(BOM_line_ask_all_child_lines(top_line_tag,&c_line_count,&c_line_tags)); if(c_line_count == 0){ printf("没有BOM结构\n"); }else{ getchibomline_isrelease(top_line_tag,err); if (strcmp(err,"")!=0) { sprintf(errs,"存在BOM对象%s子件%s未发布!!",name,err); EMH_store_error_s1(EMH_severity_information,278701,errs);//错误弹窗 ifail=EPM_nogo; } } ITKCALL(BOM_close_window(bom_window_tag)); if(name!=NULL){ MEM_free(name); name = NULL; } } POM_AM__set_application_bypass(false); } printf("ifail:%d\n",ifail); printf("===================================\n"); printf("根据BOM子件是否发布,限制流程发起 结束\n"); printf("===================================\n"); return ifail; } //递归bom 判断子是否发布 boolean getchibomline_isrelease(tag_t top_line_tag, char* err){ int m=0,status_count = 0 , rev_form_cnt=0, c_line_count = 0 , tuzhi_col=0; tag_t bom_window_tag = NULLTAG, *c_line_tags = NULL, *rev_form_tags = NULL, *tuzhi_tags= NULL; printf("nnnn\n"); ITKCALL(BOM_line_ask_all_child_lines(top_line_tag,&c_line_count,&c_line_tags)); printf("c_line_count=%d\n"+c_line_count); if(c_line_count == 0){ printf("下面没有BOM结构\n"); }else{ for (int m = 0; m < c_line_count; m++) { tag_t rev_tag =NULLTAG; char * name="\0"; ITKCALL(AOM_ask_value_tag(c_line_tags[m],"bl_line_object",&rev_tag));//获取BOMLINE关联的版本 ITKCALL(AOM_ask_value_string(rev_tag,"object_string",&name)); int wl_release_count=0; tag_t *wl_release_tags=NULL; ITKCALL(AOM_ask_value_tags(rev_tag,"release_status_list",&wl_release_count,&wl_release_tags)); if(wl_release_count > 0) { printf("版本已发布\n"); }else{ printf("版本未发布\n"); strcat(err,"["); strcat(err,name); strcat(err,"]"); } getchibomline_isrelease(c_line_tags[m],err); } } return true; } int WF_check_item_rev(EPM_rule_message_t msg){ printf("===================================\n"); printf("变更对象是否发布检查 开始\n"); printf("===================================\n"); int ifail = EPM_go; int att_cnt=0,isas=0; tag_t task_tag = NULLTAG, root_task_tag=NULLTAG, *attachments=NULL, *relations=NULL; char item1value[1024] = ""; char relationvalue[1024] = ""; char item2value[1024] = ""; char *argflag =NULL,*argvalue=NULL ,*arg = NULL; int arg_cnt = 0; int arg_col=0; int rel_cnt = 0; //获取handler的参数的个数 arg_cnt = TC_number_of_arguments(msg.arguments); ECHO("参数个数为:%d\n",arg_cnt); if (arg_cnt > 0) { for (int i=0;i0) { for (int i = 0; i < att_cnt; i++) { tag_t tagt=NULLTAG,*tag_tags=NULL; char* type=NULL; int tag_col=0; int num = 0; tag_t *num_tags = NULL; char* tagType=NULL; ITKCALL(AOM_ask_value_string(attachments[i],"object_type",&type)); printf("对象类型:%s\n",type); printf("对象类型:%s\n",item1value); if(checkIsTypeOrSubtype(attachments[i],item1value) == 1) { ITKCALL(AOM_ask_value_tags(attachments[i],relationvalue,&rel_cnt,&relations)); if(rel_cnt>0) { for (int j = 0; j < rel_cnt; j++) { if (checkIsTypeOrSubtype(relations[j],item2value) == 1){ ITKCALL(AOM_ask_value_tags(relations[j],"release_status_list",&num,&num_tags)); if(num <= 0) { ifail = EPM_nogo; EMH_store_error_s1(EMH_severity_information,278701,"对象版本没有发布,请发布!!");//错误弹窗 return ifail; } } } }else{ ifail = EPM_nogo; EMH_store_error_s1(EMH_severity_information,278701,"关系文件夹下没有版本对象!!");//错误弹窗 return ifail; } } } } return ifail; } int BOM_CHI_HASNUMBER(EPM_rule_message_t msg){ printf("===================================\n"); printf("根据BOM子件数量是否填写,限制流程发起 开始\n"); printf("===================================\n"); int ifail = EPM_go,att_cnt=0; tag_t task_tag = NULL_TAG, root_task_tag=NULLTAG, *attachments;; task_tag = msg.task; char errs[2500]="\0"; char err[2000]="\0"; if(task_tag == NULLTAG) { return EPM_nogo; } EPM_ask_root_task(task_tag, &root_task_tag); EPM_ask_attachments(root_task_tag, EPM_target_attachment, &att_cnt, &attachments); if(att_cnt<=0){ printf("目标为空 退出\n"); return EPM_go; }else{ POM_AM__set_application_bypass(true); for (int i = 0; i < att_cnt; i++) { tag_t tagt=NULLTAG; char *name=NULL; int form_c=0; tagt=attachments[i];// if (checkIsTypeOrSubtype(tagt,"PSBOMViewRevision")!=1) { printf("类型不是PSBOMViewRevision\n"); continue; } printf("类型是PSBOMViewRevision,继续\n"); ITKCALL(AOM_ask_value_string(tagt,"object_string",&name)); int m=0,c_line_count = 0; tag_t bom_window_tag = NULLTAG, top_line_tag = NULLTAG, *c_line_tags; ITKCALL(BOM_create_window(&bom_window_tag));//创建window视图 ITKCALL(BOM_set_window_top_line_bvr(bom_window_tag,tagt,&top_line_tag));//获取顶层bomline ITKCALL(BOM_line_ask_all_child_lines(top_line_tag,&c_line_count,&c_line_tags)); if(c_line_count == 0){ printf("没有BOM结构\n"); }else{ getchibomline_num(top_line_tag,err); if (strcmp(err,"")!=0) { sprintf(errs,"存在BOM行%s,%s未填写数量!!",name,err); EMH_store_error_s1(EMH_severity_information,278701,errs);//错误弹窗 ifail=EPM_nogo; } } ITKCALL(BOM_close_window(bom_window_tag)); if(name!=NULL){ MEM_free(name); name = NULL; } } POM_AM__set_application_bypass(false); } printf("ifail:%d\n",ifail); printf("===================================\n"); printf("根据BOM子件数量是否填写,限制流程发起 结束\n"); printf("===================================\n"); return ifail; } //递归bom 判断子是否填数量 boolean getchibomline_num(tag_t top_line_tag, char* err){ int m=0,status_count = 0 , rev_form_cnt=0, c_line_count = 0 , tuzhi_col=0; tag_t bom_window_tag = NULLTAG, *c_line_tags = NULL, *rev_form_tags = NULL, *tuzhi_tags= NULL; printf("nnnn\n"); ITKCALL(BOM_line_ask_all_child_lines(top_line_tag,&c_line_count,&c_line_tags)); printf("c_line_count=%d\n"+c_line_count); if(c_line_count == 0){ printf("下面没有BOM结构\n"); }else{ for (int m = 0; m < c_line_count; m++) { tag_t rev_tag =NULLTAG; char * name="\0"; char * num="\0"; ITKCALL(AOM_ask_value_string(c_line_tags[m],"bl_indented_title",&name));//获取BOMLINE行 ITKCALL(AOM_ask_value_string(c_line_tags[m],"WF2_number",&num)); if(strcmp("",num) == 0 || strcmp(" ",num) == 0) { strcat(err,"["); strcat(err,name); strcat(err,"]"); }else{ } getchibomline_num(c_line_tags[m],err); } } return true; } //word文档插入印章图片 int WF_set_picture(EPM_action_message_t msg){ printf("===================================\n"); printf("word文档插入印章图片 开始\n"); printf("===================================\n"); int ifail = ITK_ok; int att_cnt=0,jpg_count=0; tag_t task_tag = NULLTAG, root_task_tag=NULLTAG, *attachments=NULL; char** jpg_values; tag_t jpg_tag=NULLTAG; tag_t *pathFile=NULLTAG; int Num = 0; printf("开超级权限\n"); POM_AM__set_application_bypass(true); task_tag = msg.task; EPM_ask_root_task(task_tag, &root_task_tag); EPM_ask_attachments(root_task_tag, EPM_target_attachment, &att_cnt, &attachments); ITKCALL(PREF_ask_char_values("WF2_JPG_PATH",&jpg_count,&jpg_values)); ITK__convert_uid_to_tag(jpg_values[0],&jpg_tag); ITKCALL(AOM_ask_value_tags(jpg_tag,"ref_list",&Num,&pathFile)); char jpg_path[SS_MAXPATHLEN] = ""; ITKCALL(IMF_ask_file_pathname(pathFile[0], SS_WNT_MACHINE, jpg_path)); if(att_cnt>0){ for (int i = 0; i < att_cnt; i++) { int doc_num=0; tag_t *doc_tags=NULL; tag_t * dataFile = NULL; int fileNum = 0; char* tag_type; char * type; char * name; ITKCALL(AOM_ask_value_string(attachments[i],"object_type",&tag_type)); printf("tag_type=%s\n",tag_type); if (strstr(tag_type,"Revision") != NULL && strstr(tag_type,"Master") == NULL) { ITKCALL(AOM_ask_value_tags(attachments[i],"IMAN_specification",&doc_num,&doc_tags)); if (doc_num > 0) { for (int i = 0; i < doc_num; i++) { ITKCALL(AOM_ask_value_string(doc_tags[i],"object_type",&type)); printf("type=%s\n",type); if (strcmp(type,"MSWordX")==0){ //ITKCALL(AOM_ask_value_tags(doc_tags[i],"ref_list",&fileNum,&dataFile)); tag_t spec_dataset_rev = NULLTAG , ref_object = NULLTAG; AE_reference_type_t reference_type; AE_ask_dataset_latest_rev(doc_tags[i], &spec_dataset_rev); char ref_name[WSO_name_size_c + 1] = "Fnd0word"; AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object); if(reference_type == AE_PART_OF) { char pathname[SS_MAXPATHLEN] = ""; ITKCALL(IMF_ask_file_pathname(ref_object, SS_WNT_MACHINE, pathname)); char origin_file_name[IMF_filename_size_c + 1] = ""; IMF_ask_original_file_name(ref_object, origin_file_name); char new_ds_name[WSO_name_size_c + 1] = ""; char *new_file_name = USER_new_file_name(new_ds_name, ref_name, "docm", 0); char *temp_dir = getenv("temp"); char temp_file[SS_MAXPATHLEN] = ""; strcpy(temp_file, temp_dir); strcat(temp_file, "\\"); strcat(temp_file, new_file_name); IMF_export_file(ref_object, temp_file); char path[128] = "\0"; strcat(path,getenv("TEMP")); strcat(path, "\\"); strcat(path, new_file_name); strcat(path,".txt"); FILE *fpWrite=fopen(path,"w"); fprintf(fpWrite,"%s","受控印章="); fprintf(fpWrite,"%s\n",jpg_path); fclose(fpWrite); char cmd[256] = ""; strcpy(cmd, "SubstMacros-MSWord.wsf"); strcat(cmd, " \""); strcat(cmd, temp_file); strcat(cmd, "\" \""); strcat(cmd, path); strcat(cmd, "\""); printf("\n%s\n",cmd); system(cmd); tag_t new_file_tag = NULLTAG; IMF_file_t file_descriptor; IMF_import_file(temp_file, new_file_name, SS_BINARY, &new_file_tag, &file_descriptor); IMF_set_original_file_name(new_file_tag, origin_file_name); IMF_close_file(file_descriptor); AOM_save(new_file_tag); AOM_unlock(new_file_tag); AOM_lock(spec_dataset_rev); AE_remove_dataset_named_ref_by_tag(spec_dataset_rev, ref_name, ref_object); AE_add_dataset_named_ref(spec_dataset_rev, ref_name, AE_PART_OF, new_file_tag); AOM_save(spec_dataset_rev); AOM_unlock(spec_dataset_rev); } }else if (strcmp(type,"MSExcelX")==0) { //ITKCALL(AOM_ask_value_tags(doc_tags[i],"ref_list",&fileNum,&dataFile)); tag_t spec_dataset_rev = NULLTAG , ref_object = NULLTAG; AE_reference_type_t reference_type; AE_ask_dataset_latest_rev(doc_tags[i], &spec_dataset_rev); char ref_name[WSO_name_size_c + 1] = "excel"; AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object); if(reference_type == AE_PART_OF) { char pathname[SS_MAXPATHLEN] = ""; ITKCALL(IMF_ask_file_pathname(ref_object, SS_WNT_MACHINE, pathname)); char origin_file_name[IMF_filename_size_c + 1] = ""; IMF_ask_original_file_name(ref_object, origin_file_name); char new_ds_name[WSO_name_size_c + 1] = ""; char *new_file_name = USER_new_file_name(new_ds_name, ref_name, "xlsm", 0); char *temp_dir = getenv("temp"); char temp_file[SS_MAXPATHLEN] = ""; strcpy(temp_file, temp_dir); strcat(temp_file, "\\"); strcat(temp_file, new_file_name); IMF_export_file(ref_object, temp_file); char path[128] = "\0"; strcat(path,getenv("TEMP")); strcat(path, "\\"); strcat(path, new_file_name); strcat(path,".txt"); FILE *fpWrite=fopen(path,"w"); fprintf(fpWrite,"%s","受控印章="); fprintf(fpWrite,"%s\n",jpg_path); fclose(fpWrite); char cmd[256] = ""; strcpy(cmd, "SubstMacros-MSExcel.wsf"); strcat(cmd, " \""); strcat(cmd, temp_file); strcat(cmd, "\" \""); strcat(cmd, path); strcat(cmd, "\""); printf("\n%s\n",cmd); system(cmd); tag_t new_file_tag = NULLTAG; IMF_file_t file_descriptor; IMF_import_file(temp_file, new_file_name, SS_BINARY, &new_file_tag, &file_descriptor); IMF_set_original_file_name(new_file_tag, origin_file_name); IMF_close_file(file_descriptor); AOM_save(new_file_tag); AOM_unlock(new_file_tag); AOM_lock(spec_dataset_rev); AE_remove_dataset_named_ref_by_tag(spec_dataset_rev, ref_name, ref_object); AE_add_dataset_named_ref(spec_dataset_rev, ref_name, AE_PART_OF, new_file_tag); AOM_save(spec_dataset_rev); AOM_unlock(spec_dataset_rev); } } } } } } } printf("关超级权限\n"); POM_AM__set_application_bypass(false); printf("===================================\n"); printf("word文档插入印章图片 结束\n"); printf("===================================\n"); return ifail; } //word文档插入文件下发顺序号 int WF_set_ID(EPM_action_message_t msg){ printf("===================================\n"); printf("word文档插入文件下发顺序号 开始\n"); printf("===================================\n"); int ifail = ITK_ok; int att_cnt=0; tag_t task_tag = NULLTAG, item_tag = NULLTAG, root_task_tag=NULLTAG, *attachments=NULL; char *message; char** entries; char** values; tag_t* results; char * rev; char * item_type; char * ID; char WF_time[32] = "\0"; //当前时间 int doc_num=0; tag_t *doc_tags=NULL; tag_t * dataFile = NULL; int fileNum = 0; char* tag_type; char * type; char * name; printf("开超级权限\n"); POM_AM__set_application_bypass(true); task_tag = msg.task; EPM_ask_root_task(task_tag, &root_task_tag); EPM_ask_attachments(root_task_tag, EPM_target_attachment, &att_cnt, &attachments); ITKCALL(AOM_ask_value_string(attachments[0],"item_revision_id",&rev)); ITKCALL(ITEM_ask_item_of_rev(attachments[0],&item_tag)); ITKCALL(AOM_ask_value_string(item_tag,"wf2_time_id",&ID)); ITKCALL(AOM_ask_value_string(attachments[0],"object_type",&item_type)); time_t t; struct tm * lt; time (&t);//获取Unix时间戳。 lt = localtime (&t);//转为时间结构。 int lenth = 0; lenth = len(ID); printf("lenth=【%d】\n", lenth ); char str[20] = {""}; strcpy(str, ID); char dest[20] = {""}; strncpy(dest, str, 4); printf("dest=【%s】\n", dest ); char year[32] = "\0"; //当前年份 sprintf(year,"%d",lt->tm_year+1900); printf("year=【%s】\n", year ); if(strcmp("",ID)!=0 && strcmp(year,dest)==0){ printf("顺序号不为空\n"); strcat(WF_time,ID); strcat(WF_time,rev); printf("文件下发顺序号为:%s\n",WF_time); }else{ printf("顺序号为空\n"); char before_time[32] = "\0"; //早于时间 char after_time[32] = "\0"; //晚于时间 sprintf(before_time,"%d-%d-%d %d%d:%d%d",lt->tm_year+1900,12,31,0,0,0,0); sprintf(after_time,"%d-%d-%d %d%d:%d%d",lt->tm_year+1900,1,1,0,0,0,0); //构建器 const char query_name_product[1][QRY_name_size_c + 1]={"文件下发查询"}; tag_t query_tag=NULLTAG; int Num = 0; int entry_count1=0; char** entries1; char** values1; char *other_values1[4]; char *other_entrys1[4]; for (int i = 0; i < 4; i++) { other_values1[i] = (char*)calloc(48,sizeof(char)); other_entrys1[i] = (char*)calloc(48,sizeof(char)); } ITKCALL(QRY_find(query_name_product[0],&query_tag)); if(query_tag==NULLTAG) { printf("query_tag=NULLTAG,没找到 [%s]查询构建器!\n",query_name_product[0] ); ITK_exit_module(1); return 1; } else { printf("找到查询构建器\n"); } ITKCALL(QRY_find_user_entries(query_tag,&entry_count1,&entries1,&values1));//entries1:查询条件表达式;values1:查询条件值(MEM_free释放) if(entry_count1==0) { printf("entry_count1=0,查询构建器中没有配置查询条件!\n"); //ITK_exit_module(1); if(entries!=NULL){ MEM_free(entries1); entries1= NULL; } if(values1!=NULL){ MEM_free(values1); values1= NULL; } return 1; } //date_tag.second = p->tm_sec ; for(int n=0;ntm_mon+1 < 10) { sprintf(WF_time,"%d%s%d-%s%s%d-",lt->tm_year+1900,"0",lt->tm_mon+1,"0","0",Num+1); }else { sprintf(WF_time,"%d%d-%s%s%d-",lt->tm_year+1900,lt->tm_mon+1,"0","0",Num+1); } }else if(Num < 100 && Num > 10) { if (lt->tm_mon+1 < 10) { sprintf(WF_time,"%d%s%d-%s%d-",lt->tm_year+1900,"0",lt->tm_mon+1,"0",Num+1); }else { sprintf(WF_time,"%d%d-%s%d-",lt->tm_year+1900,lt->tm_mon+1,"0",Num+1); } }else { if (lt->tm_mon+1 < 10) { sprintf(WF_time,"%d%s%d-%d-",lt->tm_year+1900,"0",lt->tm_mon+1,Num+1); }else { sprintf(WF_time,"%d%d-%d-",lt->tm_year+1900,lt->tm_mon+1,Num+1); } } printf("文件编号为: \"%s\" \n", WF_time); AOM_lock(item_tag); ITKCALL(ifail = AOM_set_value_string(item_tag,"wf2_time_id",WF_time)); AOM_save(item_tag); AOM_unlock(item_tag); if(ifail !=ITK_ok){ printf("属性设值异常 \n"); return 1; } strcat(WF_time,rev); printf ( "%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果 printf("文件下发顺序号为:%s\n",WF_time); } ITKCALL(AOM_ask_value_tags(attachments[0],"IMAN_specification",&doc_num,&doc_tags)); if (doc_num > 0) { for (int i = 0; i < doc_num; i++) { ITKCALL(AOM_ask_value_string(doc_tags[i],"object_type",&type)); if (strcmp(type,"MSWordX")==0) { printf("type=%s\n",type); //ITKCALL(AOM_ask_value_tags(doc_tags[i],"ref_list",&fileNum,&dataFile)); tag_t spec_dataset_rev = NULLTAG , ref_object = NULLTAG; AE_reference_type_t reference_type; AE_ask_dataset_latest_rev(doc_tags[i], &spec_dataset_rev); char ref_name[WSO_name_size_c + 1] = "Fnd0word"; AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object); if(reference_type == AE_PART_OF) { char pathname[SS_MAXPATHLEN] = ""; ITKCALL(IMF_ask_file_pathname(ref_object, SS_WNT_MACHINE, pathname)); char origin_file_name[IMF_filename_size_c + 1] = ""; IMF_ask_original_file_name(ref_object, origin_file_name); char new_ds_name[WSO_name_size_c + 1] = ""; char *new_file_name = USER_new_file_name(new_ds_name, ref_name, "docm", 0); char *temp_dir = getenv("temp"); char temp_file[SS_MAXPATHLEN] = ""; strcpy(temp_file, temp_dir); strcat(temp_file, "\\"); strcat(temp_file, new_file_name); IMF_export_file(ref_object, temp_file); char path[128] = "\0"; char doc_id[128] = "\0"; strcat(path,getenv("TEMP")); strcat(path, "\\"); strcat(path, new_file_name); strcat(path, "-文件编号"); strcat(path,".txt"); printf("path为:%s\n",path); FILE *fpWrite=fopen(path,"w"); fprintf(fpWrite,"%s","文件编号="); strcat(doc_id,WF_time); fprintf(fpWrite,"%s\n",doc_id); fclose(fpWrite); printf("文件编号存储成功\n"); char cmd[256] = ""; strcpy(cmd, "SetID-MSWord.wsf"); strcat(cmd, " \""); strcat(cmd, temp_file); strcat(cmd, "\" \""); strcat(cmd, path); strcat(cmd, "\""); printf("\n%s\n",cmd); system(cmd); tag_t new_file_tag = NULLTAG; IMF_file_t file_descriptor; IMF_import_file(temp_file, new_file_name, SS_BINARY, &new_file_tag, &file_descriptor); IMF_set_original_file_name(new_file_tag, origin_file_name); IMF_close_file(file_descriptor); AOM_save(new_file_tag); AOM_unlock(new_file_tag); AOM_lock(spec_dataset_rev); AE_remove_dataset_named_ref_by_tag(spec_dataset_rev, ref_name, ref_object); AE_add_dataset_named_ref(spec_dataset_rev, ref_name, AE_PART_OF, new_file_tag); AOM_save(spec_dataset_rev); AOM_unlock(spec_dataset_rev); } } } } printf("关超级权限\n"); POM_AM__set_application_bypass(false); printf("===================================\n"); printf("word文档插入文件下发顺序号 结束\n"); printf("===================================\n"); return ifail; } //对象自动指派项目 int WF_item_to_Project(EPM_rule_message_t msg){ ECHO("==================目标对象指派项目=======================\n"); int ifail = EPM_go , att_cnt=0, pro_col=0, i = 0 , j=0, n=0; tag_t task_tag = NULLTAG , root_task_tag =NULLTAG , * pro_tags=NULL, pro_tag=NULL, *attachments = NULL; boolean isadmin=false; boolean istaskname=false; char errs[10240] = "\0"; task_tag = msg.task; if(task_tag == NULLTAG) { printf("对象为空,退出\n"); return EPM_nogo; } EPM_ask_root_task(task_tag, &root_task_tag); EPM_ask_attachments(root_task_tag, EPM_target_attachment, &att_cnt, &attachments); int count = 0 ; tag_t * schdule_task_nodes = NULL; char * schdule_task_name=NULL; printf("开始获取SCHDULE任务 \n"); AOM_ask_value_tags(task_tag,"fnd0RootScheduleTask",&count,&schdule_task_nodes); printf("count=%d \n",count); if(count>0){ tag_t schdule = NULL_TAG; int couwork_all=0, couwork_sta=0; tag_t * work_tag_all=NULL, * work_tag_sta=NULL; char * workname; char * workname1; ITKCALL(AOM_ask_value_tag(schdule_task_nodes[0],"schedule_tag",&schdule)); ITKCALL(AOM_ask_value_string(schdule_task_nodes[0],"object_name",&schdule_task_name)); ITKCALL(AOM_ask_value_tags(schdule,"fnd0AllWorkflows",&couwork_all,&work_tag_all));//总工作流程 ITKCALL(AOM_ask_value_tags(schdule,"fnd0StartedWorkflowTasks",&couwork_sta,&work_tag_sta));//已开始的工作流程 ITKCALL(AOM_ask_value_tags(schdule,"project_list",&pro_col,&pro_tags));//项目 if(pro_col>0){ pro_tag=pro_tags[0]; }else{ EMH_store_error_s1(EMH_severity_information,278701,"该任务所关联时间表未指派项目,无法完成任务!!!");//错误弹窗 printf("该任务所关联时间表未指派项目,无法完成任务\n"); return EPM_nogo; } int prouser_col_1=0, prouser_col_2=0, prouser_col_3=0; tag_t aUserTag=NULLTAG, * prouser_tag_1=NULL, * prouser_tag_2=NULL, * prouser_tag_3=NULL; char * userName=NULL, //person_name[SA_name_size_c+1]="", * person_name=NULL, * user_name1=NULL, * user_name2=NULL, * user_name3=NULL; PROJ_ask_team(pro_tag,&prouser_col_1,&prouser_tag_1,&prouser_col_2,&prouser_tag_2,&prouser_col_3,&prouser_tag_3);//获得项目成员 printf("prouser_col_1=%d prouser_col_2=%d prouser_col_3=%d\n ",prouser_col_1,prouser_col_2,prouser_col_3); //获取当前的用户 POM_get_user(&userName,&aUserTag); //获取personname ITKCALL(AOM_ask_value_string(aUserTag,"user_name",&person_name)); //SA_ask_user_person_name(aUserTag,person_name); printf("当前用户person_name=%s\n",person_name); if (prouser_col_2>0) //管理员用户 { for (int i = 0; i < prouser_col_2; i++) { ITKCALL(AOM_ask_value_string(prouser_tag_2[i],"user_name",&user_name2)); printf("prouser_tag_2=%s\n",user_name2); if(strcmp( user_name2, person_name ) == 0){ isadmin=true; } } } if(userName !=NULL){ MEM_free(userName); userName = NULL; } if(person_name !=NULL){ MEM_free(person_name); userName = NULL; } if(user_name1 !=NULL){ MEM_free(user_name1); user_name1 = NULL; } if(user_name2 !=NULL){ MEM_free(user_name2); user_name2 = NULL; } if(user_name3 !=NULL){ MEM_free(user_name3); user_name3 = NULL; } } printf("开始指派项目\n"); strcat(errs, "存在目标对象"); for(i = 0 ;i < att_cnt;i++){ tag_t target_tag = attachments[i];//目标下 文件夹 char * task_type = NULL; char err[100]="\0"; //ITKCALL(AOM_ask_value_string(target_tag,"object_string",&item_id_temp)); int item_count=0; tag_t *item_tags=NULL; printf("111\n"); ITKCALL(AOM_ask_value_string(target_tag,"object_type",&task_type)); printf("current task type = %s\n", task_type); if((strstr(task_type,"Folder") != NULL)){//判断是否文件夹 ITKCALL(AOM_ask_value_tags(target_tag,"contents",&item_count,&item_tags)); if(item_count>0){ for(j=0;j0){ for (int i = 0; i < att_cnt; i++) { int doc_num=0; tag_t *doc_tags=NULL; tag_t * dataFile = NULL; int fileNum = 0; char* tag_type; char* project_id; char * type; char * name; ITKCALL(AOM_ask_value_string(attachments[i],"object_type",&tag_type)); printf("tag_type=%s\n",tag_type); if (strstr(tag_type,"Revision") != NULL) { ITKCALL(AOM_ask_value_string(attachments[i],"project_ids",&project_id)); printf("project_id=%s\n",project_id); char id[512]=""; strcpy(id,"T"); strcat(id,project_id); printf("id=%s\n",id); const char query_name_product[1][QRY_name_size_c + 1]={"零组件 ID"}; char *message; tag_t* results; tag_t query_tag1=NULLTAG; int entry_count1=0; char** entries1; char** values1; char *other_values1[1]; char *other_entrys1[1]; other_values1[0] = (char*)calloc(48,sizeof(char)); other_entrys1[0] = (char*)calloc(48,sizeof(char)); int num_found1=0; ITKCALL(QRY_find(query_name_product[0],&query_tag1)); if(query_tag1==NULLTAG) { WriteLog("query_tag=NULLTAG,没找到 [%s]查询构建器!\n",query_name_product[0] ); ITK_exit_module(1); return 0; }else { WriteLog("找到查询构建器\n"); } ITKCALL(QRY_find_user_entries(query_tag1,&entry_count1,&entries1,&values1));//entries1:查询条件表达式;values1:查询条件值(MEM_free释放) if(entry_count1==0) { WriteLog("entry_count1=0,查询构建器中没有配置查询条件!\n"); //ITK_exit_module(1); if(entries1!=NULL){ MEM_free(entries1); entries1= NULL; } if(values1!=NULL){ MEM_free(values1); values1= NULL; } return 0; } for(int n=0;n 0) { for (int i = 0; i < doc_num; i++) { ITKCALL(AOM_ask_value_string(doc_tags[i],"object_type",&type)); printf("type=%s\n",type); if (strcmp(type,"MSExcelX")==0) { //ITKCALL(AOM_ask_value_tags(doc_tags[i],"ref_list",&fileNum,&dataFile)); tag_t spec_dataset_rev = NULLTAG , ref_object = NULLTAG; AE_reference_type_t reference_type; AE_ask_dataset_latest_rev(doc_tags[i], &spec_dataset_rev); char ref_name[WSO_name_size_c + 1] = "excel"; AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object); if(reference_type == AE_PART_OF) { char pathname[SS_MAXPATHLEN] = ""; ITKCALL(IMF_ask_file_pathname(ref_object, SS_WNT_MACHINE, pathname)); char origin_file_name[IMF_filename_size_c + 1] = ""; IMF_ask_original_file_name(ref_object, origin_file_name); char new_ds_name[WSO_name_size_c + 1] = ""; char *new_file_name = USER_new_file_name(new_ds_name, ref_name, "xlsm", 0); char *temp_dir = getenv("temp"); char temp_file[SS_MAXPATHLEN] = ""; strcpy(temp_file, temp_dir); strcat(temp_file, "\\"); strcat(temp_file, new_file_name); IMF_export_file(ref_object, temp_file); char path1[128] = "\0"; strcat(path1,getenv("TEMP")); strcat(path1, "\\"); strcat(path1, new_file_name); strcat(path1,".txt"); FILE *fpWrite=fopen(path1,"w"); fprintf(fpWrite,"%s","样品图片="); fprintf(fpWrite,"%s\n",path); fclose(fpWrite); char cmd[256] = ""; strcpy(cmd, "SetPicture-MSExcel.wsf"); strcat(cmd, " \""); strcat(cmd, temp_file); strcat(cmd, "\" \""); strcat(cmd, path1); strcat(cmd, "\""); printf("\n%s\n",cmd); system(cmd); remove(path); tag_t new_file_tag = NULLTAG; IMF_file_t file_descriptor; IMF_import_file(temp_file, new_file_name, SS_BINARY, &new_file_tag, &file_descriptor); IMF_set_original_file_name(new_file_tag, origin_file_name); IMF_close_file(file_descriptor); AOM_save(new_file_tag); AOM_unlock(new_file_tag); AOM_lock(spec_dataset_rev); AE_remove_dataset_named_ref_by_tag(spec_dataset_rev, ref_name, ref_object); AE_add_dataset_named_ref(spec_dataset_rev, ref_name, AE_PART_OF, new_file_tag); AOM_save(spec_dataset_rev); AOM_unlock(spec_dataset_rev); } } } } } } } printf("关超级权限\n"); POM_AM__set_application_bypass(false); printf("===================================\n"); printf("机加工计划插入图纸图片图片 结束\n"); printf("===================================\n"); return ifail; } //复制流程到当前home目录下的文件夹 int WF_LC_Folder_System(EPM_action_message_t msg) { printf("===================================\n"); printf("复制流程到当前home目录下的文件夹 开始 \n"); printf("===================================\n"); int ifail = ITK_ok; printf("开超级权限\n"); POM_AM__set_application_bypass(true); char *userName; tag_t aUserTag = NULLTAG;//当前用户对象 tag_t homefolder = NULLTAG; //拿到当前用户的home文件夹对象 tag_t targetfolder = NULLTAG; //获取指定文件夹对象 tag_t *folder; // int item_count = 0; tag_t newcopyFolder = NULLTAG; //复制的到的新的文件夹对象 char *task_name; int s = 0; //流程节点相关 tag_t root_task = NULLTAG, *sub_tasks = NULL, current_task = NULLTAG, type_tag = NULLTAG; printf("流程节点相关\n"); int sub_task_count = 0; //EPM_ask_root_task(task_tag, &root_task_tag); // EPM_ask_attachments(root_task_tag, EPM_target_attachment, &att_cnd, &attachments); printf("获取用户\n"); s = POM_get_user(&userName, &aUserTag); //获取当前用户的home文件夹 ITKCALL(SA_ask_user_home_folder(aUserTag, &homefolder)); //获取指定的文件夹对象 ITKCALL(AOM_ask_value_tags(homefolder,"contents",&item_count,&folder)); for (int i = 0; i < item_count; i++) { char *name; ITKCALL(AOM_ask_value_string(folder[i],"object_name",&name)); if(strcmp("我的文件夹",name)==0){ targetfolder = folder[i]; break; } if(name != NULL){ MEM_free(name); } } //得到触发handler的节点 //msg.task; current_task = msg.task; //判断当前节点 if (current_task != NULLTAG) { printf("%%%%%%%%%%%%++++++++++++++ 当前节点不为空"); char *task_name; ITKCALL(AOM_ask_value_string(current_task, "object_name", &task_name)); ECHO("task_name = %s\n", task_name); if(strstr(task_name,"编制")!=NULL){ if(targetfolder != NULL){ ITKCALL(FL_insert(targetfolder, current_task, 999)); ITKCALL(AOM_save(targetfolder)); }else { ITKCALL(FL_insert(homefolder, current_task, 999)); ITKCALL(AOM_save(homefolder)); } }else{ int count = 0,perform_count = 0,usr_item_count = 0; tag_t *be_tag = NULLTAG,*usr_folder; char *node_task_name; tag_t *perform_attaches = NULLTAG,memberTag = NULLTAG,user_tag = NULLTAG,usr_homefolder = NULLTAG; int *attach_type; SIGNOFF_TYPE_t memberType; ITKCALL(AOM_ask_value_tags(current_task,"predecessors",&count, &be_tag)); for (int j = 0; j < count; j++) { EPM_ask_name2(be_tag[j], &node_task_name); ECHO("node_task_name = %s\n", node_task_name); if (stricmp(node_task_name, "select-signoff-team") == 0) { EPM_ask_all_attachments(be_tag[j], &perform_count, &perform_attaches, &attach_type); ECHO("perform_count=%d\n", perform_count); for (int i = 0; i