You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

670 lines
19 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "signoff_rev.h"
#include "tccore\iman_msg.h"
//流程节点信息
struct FLOWNODEINFOS
{
char taskname[128];
char username[128];
char timeinfo[128];
char group[128];
char comments[1024];
}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];
int nodecount = 0;
int userinfoscount = 0;
int timeinfoscount = 0;
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] = "";
char* cur_task_name;
//编制判断变量
int s = 0;
EPM_decision_t decision = EPM_nogo;
char* userName;
char *timeinfo1 = "",* person_name,*group_name="",*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;
EPM_signoff_decision_t signoff_decision;
char *comments,*timeinfo="",*group_full_name = NULL;
tag_t user_tag=NULLTAG, group_tag = NULLTAG;
//循环判断变量
int i=0;
EPM_ask_name2( 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_name2( tempTask, &cur_task_name );
}
else if( strstr( cur_task_name, "编制" )!=NULL || 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_name2( task_node, &cur_task_name );
}
}
if(cur_perform_task != NULLTAG )
{
if( strstr(cur_task_name,"编制") !=NULL||strcmp( cur_task_name, "设计" ) == 0 )
{
tag_t owner = NULLTAG;
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_name2(owner, &person_name);
AOM_ask_value_date(cur_perform_task,prop_name,&decision_date);
DATE_date_to_string(decision_date,arg3value,&timeinfo1);
//ITK_date_to_string (decision_date, &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_name2(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));;
//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<string> ans;
//if( d_value != NULL )
//{
// Split(d_value, ' ', ans);
// if(ans.size() > 1)
// strcat(output_str,ans[0].c_str());
//}
EPM_ask_all_attachments(cur_perform_task,&perform_count,&perform_attaches,&attach_type);
for(i=0;i<perform_count;i++)
{
EPM_ask_signoff_member(perform_attaches[i], &memberTag, &memberType);
//CR_ask_signoff_decision2(perform_attaches[i], &signoff_decision, &comments, &decision_date);
EPM_ask_signoff_decision(perform_attaches[i], &signoff_decision, &comments, &decision_date);
ECHO("\n--------\comments : %s\n---------\n",comments);
if(memberType == SIGNOFF_GROUPMEMBER)
{
SA_ask_groupmember_user(memberTag, &user_tag);
SA_ask_groupmember_group(memberTag,&group_tag);
SA_ask_user_person_name2(user_tag, &person_name);
SA_ask_group_display_name(group_tag,&group_name);
char date_buf[128]="";
DATE_date_to_string(decision_date,arg3value,&timeinfo);
//ITKCALL(ITK_date_to_string(decision_date, &timeinfo));
//sprintf( date_buf, "%4d-%02d-%02d", decision_date.year, decision_date.month+1, decision_date.day );
strcpy(flownode_s[nodecount].taskname,cur_task_name);
strcpy(flownode_s[nodecount].username,person_name);
strcpy(flownode_s[nodecount].timeinfo,timeinfo);
strcpy(flownode_s[nodecount].group,group_name);
strcpy(flownode_s[nodecount].comments,comments);
printf("cur_task_name=%s\n",cur_task_name);
printf("person_name=%s\n",person_name);
printf("timeinfo=%s\n",timeinfo);
printf("group_name=%s\n",group_name);
printf("comments=%s\n",comments);
nodecount = nodecount + 1;
}
}
}
}
ECHO("output_str=%s",output_str);
return ifail;
}
void SplitUserInfo(char *userinfo)
{
char* token = NULL, *ptr = NULL, temp[512] = "";
token = strtok( userinfo, ";");
while( token != NULL )
{
/* While there are tokens in "string" */
strcpy(temp,token);
ECHO( "token=%s\n", token );
ptr = strstr(temp, "=");
if (ptr != NULL)
{
strcpy(userinfo_s[userinfoscount].propertyname, ptr +1);
strcpy(ptr,"\0");
strcpy(userinfo_s[userinfoscount].taskname ,temp);
ECHO("\nuserinfo_s[userinfoscount].taskname=%s,userinfo_s[userinfoscount].propertyname=%s\n",
userinfo_s[userinfoscount].taskname,userinfo_s[userinfoscount].propertyname);
}
userinfoscount ++;
/* Get next token: */
token = strtok( NULL, ";");
}
}
void SplitTimeInfo(char *userinfo)
{
char* token = NULL, *ptr = NULL, temp[512] = "";
token = strtok( userinfo, ";");
while( token != NULL )
{
/* While there are tokens in "string" */
strcpy(temp,token);
ECHO( "token=%s\n", token );
ptr = strstr(temp, "=");
if (ptr != NULL)
{
strcpy(timeinfo_s[timeinfoscount].propertyname, ptr +1);
strcpy(ptr,"\0");
strcpy(timeinfo_s[timeinfoscount].taskname ,temp);
}
timeinfoscount ++;
/* Get next token: */
token = strtok( NULL, ";");
}
}
/**
*
* Description:
* This handler will set signoff infomation to properties of rev
*
* Syntax:
* jf-sign-tongzhi [-debug=true|false]
*
* -SignUserName: 编制=d5_biaojian;会签=d5_huiqian;审核=d5_jiaodui
*
* -SignDate: 编制=d5_biaojiantime;校对=d5_huiqianTime;审核=d5_jiaoduiTime
*
* -SignDateFormate: %Y-%m-%d
*
* -bypass(去掉)
*
* -include_type 需要签名的表单类型(去掉)
*
*/
int HS_signoff_rev(EPM_action_message_t msg)
{
//EPM_rule_message_t rul_msg;
int ifail = ITK_ok, rcode = 0;
//参数相关
char arg1value[1024] = "",arg2value[1024] = "",arg3value[1024]="",arg4value[1024]="",
signcounter_info[1024] = "";
char *argflag =NULL,*argvalue=NULL ,*arg = NULL;
BOOL bypass = FALSE,setboth = TRUE;
int arg_cnt = 0;
//流程节点相关
tag_t root_task = NULLTAG,*sub_tasks = NULL,current_task = NULLTAG,type_tag = NULLTAG;
int sub_task_count = 0;
char* root_task_name,* task_name;
int occur_of_counts = 0;
tag_t *taskAttches = NULLTAG;
char tgt_type[WSO_name_size_c+1]="",*type_class;
////循环内部变量
tag_t cur_task = NULLTAG;
char *task_type;
//循环变量
int i=0, j=0, k=0, count = 0, n = 0;
//节点信息变量
char sign_info[2048]="";
//节点循环处理变量
tag_t itemrevision = NULLTAG,master_form_rel_type = NULLTAG;
char *rev_id;
char item_id[ITEM_id_size_c+1]="";
int form_count = 0;
tag_t *form_list = NULL,master_form = NULLTAG;
char local_path[128]="";
//编制节点
int s=0;
char *timeinfo2="";
EPM_decision_t decision = EPM_nogo;
tag_t aUserTag,responsibleParty;
char *userName;
date_t decision_date;
char *person_name;
char *prop_name="last_mod_date";
////登录信息
//char *user_name = NULL, *group_full_name = NULL;
//tag_t user_tag = NULLTAG, group_tag = NULLTAG;
//char *txtfile = NULL;
//会签相关
int n_prop=0, q = 0;
char **prop_names=NULL, hq_name[128] = "", hq_time_name[128] = "", *hq_value=NULL;
char exclude_type[256]="", item_type[ITEM_type_size_c+ 1]= "";
tag_t item = NULLTAG;
logical is_sign = false;
//得到触发此函数的节点
current_task = msg.task;
//CreateLogFile("PLA8_signoff",&txtfile);
ECHO("=========================================================\n");
ECHO("HS_signoff_rev 开始执行\n");
ECHO("=========================================================\n");
//获取handler的参数的个数
arg_cnt = TC_number_of_arguments(msg.arguments);
ECHO("参数个数为:%d\n",arg_cnt);
if (arg_cnt > 0)
{
for (i=0;i<arg_cnt;i++)
{
//获取下一个参数从0开始
arg = TC_next_argument(msg.arguments);
//获取参数的名称和值
ifail = ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue);
if (stricmp(argflag, "SignUserName") == 0)
{
//strcmp("","");
if(argvalue != NULL)
{
strcpy(arg1value,argvalue);
}
}
else if(stricmp(argflag, "SignDate") == 0)
{
if(argvalue != NULL)
{
strcpy(arg2value,argvalue);
}
}
else if(stricmp(argflag,"SignDateFormate") == 0)
{
if(argvalue != NULL)
{
strcpy(arg3value,argvalue);
}
}
else if(stricmp(argflag,"bypass") == 0)
{
bypass = TRUE;
}else if(stricmp(argflag,"setboth") == 0){
setboth = FALSE;
}
//else if(stricmp(argflag,"exclude_type") == 0)
//{
// if(argvalue != NULL)
// {
// strcpy(exclude_type,argvalue);
// }
//}
}
MEM_free(argflag);
MEM_free(argvalue);
}
//if(bypass)
//AM__set_application_bypass(TRUE);
ITK_set_bypass(TRUE);
ECHO("SignUserName : %s\n",arg1value);
ECHO("SignDate : %s\n",arg2value);
//ECHO("SignDateFormat : %s\n",arg3value);
//ECHO("exclude_type : %s",exclude_type);
//getUserinfo(arg1value);
SplitUserInfo(arg1value);
//getTimeinfo(arg2value);
SplitTimeInfo(arg2value);
//getCounterinfo(signcounter_info);
vector<string> 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_name2( root_task, &root_task_name );
//
ECHO("root_task_name=%s\n",root_task_name);
EPM_ask_name2( 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节点 配置在do节点
if(strstr(task_name,"编制") !=NULL||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_name2(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;i<sub_task_count;i++)
{
cur_task = sub_tasks[i];
//char * obj_type =NULL;
//通过AOM获取属性从而获取类型
//AOM_ask_value_string(cur_task,"object_type",&obj_type);
//获取对象的类型参数1对象参数2类型值
//AOM与WSOM的区别WSOM可以理解为在AOM的基础上封装的一些功能函数
//通过WSOM的功能大多数时候可以避免使用多层的AOM嵌套WSOM封装的更加完善.
//AOM是对对象的属性进行操作包括关系属性和一些基本的属性可以set和get
//POM是更加偏底层的一种属性操作是直接操作数据库的AOM可以理解为是在POM的基础上封装的一般如非必要不推荐使用POM
WSOM_ask_object_type2(cur_task,&task_type);
ECHO("current task type = %s\n", task_type);
ORIGIN_ask_sign_info( cur_task, sign_info, task_name,arg3value);
}
}
ECHO("获取属性END sign_info = %s\n", sign_info);
ECHO("the node number is %d",nodecount);
if(current_task != NULLTAG)
{
//获取流程目标EPM_target_attachment(流程目标)/EPM_reference_attachment流程引用
//第一个参数:跟流程,
//参数2获取的关系类型有两种1目标EPM_target_attachment 2引用EPM_reference_attachment
//参数3返回的个数
//参数4返回关系下面的所有的对象
EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &taskAttches);
ECHO("%d target attachment found",occur_of_counts);
for( count=0; count<occur_of_counts; count++ )
{
ECHO("the %dth work",count);
//获取类型的第三种方法
TCTYPE_ask_object_type(taskAttches[count], &type_tag);
ifail = TCTYPE_ask_class_name2(type_tag, &type_class);
ECHO("type_class : %s",type_class);
//过滤掉非版本对象
if (((strstr(type_class,"Revision") != NULL) || (strstr(type_class,"revision") != NULL))
&&(strstr(type_class,"Master") == NULL) &&(strstr(type_class,"master") == NULL) && (strcmp(type_class,"PSBOMViewRevision") != 0)
//&& (strstr(type_class,"BOM") ==NULL) && (strstr(type_class,"bom") ==NULL) && (strstr(type_class,"Bom") == NULL)
)
{
ECHO("==================WORKING======================");
is_sign = true;
itemrevision = taskAttches[count];
//获取版本ID
ITEM_ask_rev_id2(itemrevision,&rev_id);
//通过版本得到对象
ITEM_ask_item_of_rev( itemrevision, &item);
//GRM对关系操作
//先找到关系参数1关系名称参数2返回关系对象
GRM_find_relation_type( TC_master_form_rtype, &master_form_rel_type );
//获取某个对象下的某种关系下的所有的对象参数1需要操作的对象参数2关系参数3返回数量参数4返回对象数组
GRM_list_secondary_objects_only(itemrevision, master_form_rel_type, &form_count, &form_list );
//if( form_count ==0 )
//{
// ECHO("未找到签名form,继续...");
// continue;
//}
//master_form = itemrevision;//form_list[0]; //属性写到版本上
master_form = form_list[0];
ECHO("Begin set properties for name\n");
AOM_load (master_form);
//if(bypass)
//开启超级管理员权限使用的时候必须先声明必须要成对使用true开启false关闭
POM_AM__set_application_bypass(true);
if(setboth){
ECHO("Begin set both\n");
for(j=0; j<userinfoscount; j++)
{
char t_tt_name[1024] = "";
if(strstr(userinfo_s[j].taskname,"意见") != NULL){
for(k=0; k<nodecount; k++)
{
if(strstr(userinfo_s[j].taskname,flownode_s[k].taskname) != NULL)
{
char t_name[512]="\0";
sprintf(t_name,"%s",flownode_s[k].comments);
if(strcmp(t_tt_name,"") != 0){
strcat(t_tt_name,"$");
}
if(strcmp(t_name,"") == 0){
strcat(t_tt_name," ");
}else{
strcat(t_tt_name,t_name);
}
}
}
}
/*else if(strstr(userinfo_s[j].taskname,"部门") != NULL){
for(k=0; k<nodecount; k++)
{
if(strstr(userinfo_s[j].taskname,flownode_s[k].taskname) != NULL)
{
char t_name[512]="\0";
sprintf(t_name,"%s",flownode_s[k].group);
if(strcmp(t_tt_name,"") != 0){
strcat(t_tt_name,"$");
}
strcat(t_tt_name,t_name);
}
}
}*/
else{
//ECHO("userinfo_s[j].taskname:%s",userinfo_s[j].taskname);
for(k=0; k<nodecount; k++)
{
if(strcmp(userinfo_s[j].taskname,flownode_s[k].taskname) == 0)
{
char t_name[512]="\0";
sprintf(t_name,"%s",flownode_s[k].username);
if(strcmp(t_tt_name,"") != 0){
strcat(t_tt_name,"$");
}
strcat(t_tt_name,t_name);
}
}
}
//POM_AM__set_application_bypass(true);
//先lock
if(strcmp(t_tt_name,"")!=0){
ECHO("t_tt_name_________= %s\n",t_tt_name);
/*
* AOM_lock(master_form);
ECHO("set prop %s=%s\n",userinfo_s[j].propertyname,userinfo_s[j].taskname);
//再set
AOM_set_value_string( master_form, userinfo_s[j].propertyname, t_tt_name) ;
//再save
AOM_save( master_form ) ;
//最后unlock
AOM_unlock( master_form ) ;
//break;
*/
AOM_lock(itemrevision);
ECHO("set prop %s=%s\n",userinfo_s[j].propertyname,userinfo_s[j].taskname);
//再set
AOM_set_value_string(itemrevision, userinfo_s[j].propertyname, t_tt_name) ;
//再save
AOM_save(itemrevision) ;
//最后unlock
AOM_unlock(itemrevision) ;
//break;
}
}
ECHO("Begin set properties for time\n");
POM_AM__set_application_bypass(true);
for(j=0;j< timeinfoscount;j++)
{
//ECHO("%s : ",timeinfo_s[j].taskname);
char t_tt_time[1024] = "";
for(k=0;k<nodecount;k++)
{
if(strcmp(timeinfo_s[j].taskname,flownode_s[k].taskname) == 0)
{
char t_time[512]="\0";
sprintf(t_time,"%s",flownode_s[k].timeinfo);
if(strcmp(t_tt_time,"") != 0){
strcat(t_tt_time,"$");
}
strcat(t_tt_time,t_time);
}
}
//先lock
if(strcmp(t_tt_time,"")!=0){
/* AOM_lock(master_form);
//再set
AOM_set_value_string( master_form, timeinfo_s[j].propertyname, t_tt_time) ;
//再save
AOM_save( master_form ) ;
//最后unlock
AOM_unlock( master_form ) ;
//break;
*/
AOM_lock(itemrevision);
//再set
AOM_set_value_string(itemrevision, timeinfo_s[j].propertyname, t_tt_time) ;
//再save
AOM_save(itemrevision) ;
//最后unlock
AOM_unlock(itemrevision) ;
//break;
}
}
}
ECHO("==================WORK END====================\n");
}
}
ECHO("close bypass...\n");
//AM__set_application_bypass(FALSE);
POM_AM__set_application_bypass(false);
}
EMH_clear_errors();
MEM_free(form_list);
//CloseLog();
nodecount = 0;
userinfoscount = 0;
timeinfoscount = 0;
end_handler:
//CloseLog();
DOFREE(taskAttches);
//DOFREE(pref_values);
//if (debug)
{
printf("=========================================================\n");
printf("hander HS_signoff_rev 执行完成\n");
printf("=========================================================\n");
}
return rcode;
}