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.

321 lines
9.7 KiB

#pragma warning (disable: 4996)
#pragma warning (disable: 4819)
/**
* @headerfile tcua Í·Îļþ
*/
#include <tc\tc_macros.h>
#include <tc\emh.h>
#include <tc\preferences.h>
#include <property\propdesc.h>
#include <epm\epm.h>
#include <epm\epm_toolkit_tc_utils.h>
#include <tccore\item.h>
#include <tccore\grmtype.h>
#include <tccore\grm.h>
#include <tccore\imantype.h>
#include <sa\am.h>
#include <sa\sa.h>
#include <tccore\aom.h>
#include <tccore\aom_prop.h>
#include <property\prop_errors.h>
#include <tccore\workspaceobject.h>
#include <qry\qry.h>
#include <bom\bom_attr.h>
#include <bom\bom.h>
#include <epm\signoff.h>
#include <pom\pom\pom.h>
#include <pom\pom\pom_errors.h>
#include <fclasses\tc_date.h>
#include <epm\cr.h>
#include <cfm\cfm.h>
#include <sa\am.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <string>
#include <iostream>
#include <iterator>
#include <map>
#include <vector>
using namespace std;
/**
* @headerfile user's header files
*/
#include "epm_handler_common.h"
#include "error_handling.h"
#define BOM_VIEWTYPE "view"
void ECHO(char *format, ...);
extern "C" int POM_AM__set_application_bypass(logical bypass);
extern "C" int AM__set_application_bypass(logical bypass);
int getBomView(tag_t rev_tag, char* viewtype, tag_t *bomView, tag_t *bomBVR, int debug);
int CycleBOM1( tag_t bomline, char *userid,char *status, vector<tag_t> &attach_vec, map< string,int > &errMap, logical debug)
{
tag_t child_item_tag = NULLTAG, child_rev_tag = NULLTAG, ebom_view = NULLTAG, ebom_bvr = NULLTAG,
*child_lines = NULL, *status_tag_list = NULL, last_rev = NULLTAG, owning_user = NULLTAG;
int ifail = ITK_ok ,j = 0, itemrev_attr_id = 0, zuhao_attr_id = 0, child_cnt = 0, viewtype_attr_id = 0,
status_attr_id = 0, status_count = 0;
char child_item_id[ITEM_id_size_c + 1]="", *viewtype_value = NULL, *status_list = NULL,
child_rev_id[8]="", user_id[33]="";
ITKCALL(ifail = BOM_line_look_up_attribute(bomAttr_itemRevStatus, &status_attr_id));
ITKCALL( ifail = BOM_line_look_up_attribute(bomAttr_lineItemRevTag, &itemrev_attr_id));
ITKCALL(ifail = BOM_line_ask_child_lines(bomline, &child_cnt, &child_lines));
for( int i = 0; i < child_cnt; i++ )
{
//ITKCALL(ifail = BOM_line_ask_attribute_string(child_lines[k], status_attr_id, &status_list));
ITKCALL( ifail = BOM_line_ask_attribute_tag(child_lines[i], itemrev_attr_id, &child_rev_tag));
ITKCALL(AOM_ask_owner( child_rev_tag, &owning_user));
ITKCALL (SA_ask_user_identifier(owning_user, user_id));
if( debug )
ECHO("process user_id is %s, object owner is %s\n", userid, user_id);
if( strcmp( userid, user_id ) ==0 )
{
ITKCALL(WSOM_ask_release_status_list(child_rev_tag,&status_count,&status_tag_list));
logical isInculde = false;
if( status_count > 0 )
{
for (int j = 0;j < status_count;j++)
{
char status_type[WSO_name_size_c+1] = "";
ITKCALL(CR_ask_release_status_type(status_tag_list[j],status_type));
if( debug )
ECHO("Ö¸¶¨×´Ì¬:%s, ¶ÔÏó·¢²¼×´Ì¬£º%s\n",status,status_type);
if( stricmp(status_type, status) == 0 )
{
int last_status_count = 0;
tag_t *last_status_tag_list = NULL,new_child_rev = NULLTAG;
ITKCALL(ITEM_ask_item_of_rev( child_rev_tag, &child_item_tag ));
ITKCALL(ITEM_ask_latest_rev( child_item_tag, &last_rev ));
ITKCALL(WSOM_ask_release_status_list(last_rev,&last_status_count,&last_status_tag_list));
if( last_status_count == 0 )
{
attach_vec.push_back(last_rev);
if( debug )
ECHO("add last_rev");
}
else
{
POM_AM__set_application_bypass(true);
//ITKCALL( ITEM_create_rev(child_item_tag, NULL, &new_child_rev ));
ITKCALL( ITEM_copy_rev( last_rev,NULL, &new_child_rev ));
ITKCALL(AOM_save(new_child_rev));
ITKCALL(AOM_unlock(new_child_rev));
attach_vec.push_back(new_child_rev);
if( debug )
ECHO("add new_child_rev");
}
DOFREE(last_status_tag_list);
}
} //for
}
else
{
attach_vec.push_back(child_rev_tag);
if( debug )
ECHO("add self");
}
DOFREE(status_tag_list);
}
}
for( int i = 0; i < child_cnt; i++ )
{
ifail = CycleBOM1(child_lines[i], userid, status, attach_vec, errMap, debug);
}
return ifail;
}
int HZ_attach_assembly(EPM_action_message_t msg)
{
int ifail = ITK_ok, arg_cnt = 0, att_cnt = 0, i, j, k, m,p,q, pref_count = 0, bvr_cnt = 0, child_cnt = 0,
status_attr_id = 0, rev_attr_id = 0, form_count =0, value_count = 0,n_instances = 0,
factory_count = 0, num = 0, bvr_count = 0;
tag_t task_tag = NULLTAG, rootTask_tag = NULLTAG, type_tag = NULLTAG, rev_rule_tag = NULLTAG;
tag_t *attachments = NULL, *bvrs = NULL, *child_lines = NULL, child_rev_tag = NULLTAG, item_tag = NULLTAG,
rev_tag = NULLTAG;
char *arg = NULL, *flag = NULL, *value = NULL, **values = NULL, type_class[WSO_object_type_size_c+1],
item_id[ITEM_id_size_c+1], rev_id[ITEM_id_size_c+1], *argflag =NULL,*argvalue=NULL ,
arg_rev_rule[128] = "",arg_status[128] = "",arg3value[128]="",arg_debug[10]="", userid[33]="";
int attachment_types = 0;
logical is_bypass= false;
logical debug = true;
tag_t bomWindow = NULLTAG, bom_top_line = NULLTAG, bom_config_rule = NULLTAG;
map<string,int> errMap;
vector<tag_t> attach_vec;
EPM_decision_t decision = EPM_go;
ECHO("*************************************************************\n");
ECHO("* HZ_attach_assembly is comming ! *\n");
ECHO("*************************************************************\n");
POM_AM__set_application_bypass(true);
ECHO("POM_AM__set_application_bypass\n");
task_tag = msg.task;
if(task_tag == NULLTAG)
{
ifail = ITK_ok;
//goto end_handler;
return ifail;
}
tag_t rootTask = NULLTAG;
//»ñµÃ²ÎÊý
arg_cnt = TC_number_of_arguments(msg.arguments);
if (debug)
ECHO("\n arg_cnt=%d\n",arg_cnt);
ITKCALL(ifail = EPM_setup_parser(task_tag));
for (i=0;i<arg_cnt;i++)
{
arg = TC_next_argument(msg.arguments);
ITKCALL(ifail = ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue));
if (stricmp(argflag, "rev_rule") == 0)
{
if(argvalue != NULL)
{
strcpy(arg_rev_rule,argvalue);
}
}
else if(stricmp(argflag, "status") == 0)
{
if(argvalue != NULL)
{
strcpy(arg_status,argvalue);
}
}
else if(stricmp(argflag,"debug") == 0)
{
if( argvalue!= NULL)
{
strcpy(arg_debug,argvalue);
if( strcmp( arg_debug, "true") == 0)
{
debug = true;
}
else
{
debug = false;
}
}
}
}
//tag_t group_member = NULLTAG;
tag_t user = NULLTAG;
ifail = CFM_find(arg_rev_rule, &rev_rule_tag );
ITKCALL(ifail = EPM_ask_root_task(task_tag, &rootTask_tag));
ITKCALL(AOM_ask_owner(rootTask_tag, &user));
ITKCALL(SA_ask_user_identifier( user , userid));
ECHO("userid:%s\n",userid);
if( strlen(arg_status)< 2 )
{
EPM_set_decision(msg.task, user, CR_no_decision, "", false );
EMH_store_error_s1(EMH_severity_information, HANDLER_ARGUMENT_ERROR, "ȱÉÙstatus²ÎÊý");
ifail = CR_error_in_handler;
return ifail;
}
//if( strlen(arg_rev_rule)< 2 )
//{
// EPM_set_decision(msg.task, user, CR_no_decision, "", false );
// EMH_store_error_s1(EMH_severity_information, HANDLER_ARGUMENT_ERROR, "ȱÉÙrev_rule²ÎÊý");
// ifail = CR_error_in_handler;
// return ifail;
//}
ITKCALL(ifail = EPM_ask_attachments(rootTask_tag, EPM_target_attachment, &att_cnt, &attachments));
if( debug )
ECHO("DEBUG: find %d target\n", att_cnt);
for( i = 0; i < att_cnt; i++ )
{
ITKCALL( WSOM_ask_object_type(attachments[i], type_class));
if (((strstr(type_class,"Revision") != NULL) || (strstr(type_class,"revision") != NULL))
&&(strstr(type_class,"Master") == NULL) &&(strstr(type_class,"master") == NULL)
&& (strstr(type_class,"BOM") ==NULL) && (strstr(type_class,"bom") ==NULL) && (strstr(type_class,"Bom") == NULL))
{
rev_tag = attachments[i];
ITKCALL(ITEM_ask_item_of_rev(rev_tag, &item_tag));
ITKCALL(ITEM_ask_id(item_tag, item_id));
tag_t ebom_view = NULLTAG, ebom_bvr = NULLTAG, ebom_window = NULLTAG, ebom_line = NULLTAG,
dbom_view = NULLTAG,dbom_bvr = NULLTAG;
ifail = getBomView(rev_tag, BOM_VIEWTYPE, &ebom_view, &ebom_bvr, 1);
if( ebom_view != NULLTAG )
{
ITKCALL( BOM_create_window( &ebom_window ) );
if( rev_rule_tag != NULLTAG)
ITKCALL( BOM_set_window_config_rule(ebom_window, rev_rule_tag));
ITKCALL( BOM_set_window_top_line_bvr( ebom_window, ebom_bvr, &ebom_line ) );
CycleBOM1(ebom_line,userid ,arg_status,attach_vec,errMap,debug);
ITKCALL(BOM_close_window(ebom_window));
}
}
}
DOFREE(attachments);
if (debug)
ECHO("\nDEBUG: attach_vec.size=%d\n",attach_vec.size());
attachment_types = EPM_target_attachment;
POM_AM__set_application_bypass(true);
for( i = 0; i < attach_vec.size(); i ++ )
{
ITKCALL(EPM_add_attachments(rootTask_tag, 1,&(attach_vec[i]),&attachment_types));
}
if( debug )
ECHO("DEBUG: errMap.size is %d\n", errMap.size());
//ÊÍ·Å
attach_vec.clear();
//¹Ø±Õbypass
//POM_AM__ask_application_bypass( &is_bypass );
//if( is_bypass );
POM_AM__set_application_bypass( false );
//if( errMap.size() > 0 )
//{
// EPM_set_decision(msg.task, user, CR_no_decision, "", false );
// map<string,int>::iterator err_it;
// for( err_it = errMap.begin(); err_it != errMap.end(); err_it++ )
// {
// ECHO("DEBUG: err_it is %s\n", err_it->first.c_str());
// EMH_store_error_s1(EMH_severity_information,err_it->second, err_it->first.c_str());
// }
// ifail = CR_error_in_handler;
// return ifail;
//}
errMap.clear();
ECHO("\n************************************************************\n");
ECHO("* HZ_attach_assembly is end! *\n");
ECHO("*************************************************************\n");
return ITK_ok;
}