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.

389 lines
12 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.

#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 <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, ...)
{
//if( !YFJC_OPT_DEBUG )
// return;
char msg[20480];
va_list args;
va_start( args, format );
vsprintf( msg, format, args );
va_end( args );
printf( msg );
TC_write_syslog( msg );
}
int getBomView(tag_t rev_tag, char* viewtype, tag_t *bomView, tag_t *bomBVR, int debug)
{
int ifail = ITK_ok, rcode = 0, count = 0, i = 0, j =0, p =0, q = 0, length = 0,child_cnt = 0,
bvr_count =0, n = 0, bom_attr_id = 0, itemid_attr_id = 0,revid_attr_id = 0, view_count =0,
itemrev_attr_id = 0, qty_attr_id = 0, seq_attr_id = 0, child_bvr_count = 0, factory_count =0;
tag_t item = NULLTAG, new_bom_line = NULLTAG, folder = NULLTAG, *bomview_list = NULL, *bvr_list = NULL,
p_rev_tag = NULLTAG, bom_view = NULLTAG, bvr = NULLTAG, child_item_tag = NULLTAG, view_type = NULLTAG,
mbom_bvr = NULLTAG, ebom_bvr = NULLTAG,ebom_view = NULLTAG, mbom_view = NULLTAG;
char object_type[WSO_object_type_size_c+1]="",*value = NULL;
*bomBVR = NULLTAG;
*bomView = NULLTAG;
ITKCALL( ITEM_rev_list_bom_view_revs( rev_tag, &bvr_count, &bvr_list ) );
if( bvr_count > 0 )
{
mbom_bvr = NULLTAG;
for( i=0; i < bvr_count; i++ )
{
ITKCALL(PS_ask_bom_view_of_bvr(bvr_list[i], &bom_view));
ITKCALL(PS_ask_bom_view_type(bom_view, &view_type));
//ITKCALL( PS_find_view_type(bom_view, &view_type));
char *view_type_name = NULL;
ITKCALL(PS_ask_view_type_name(view_type, &view_type_name));
if( debug )
ECHO("\nDEBUG: view_type_name=%s\n", view_type_name);
if (tc_strcmp(view_type_name, viewtype) == 0)
{
*bomBVR = bvr_list[i];
*bomView = bom_view;
}
DOFREE(view_type_name);
}
}
DOFREE(bvr_list);
return ifail;
}
//equal=0Ϊ>=,equal=1Ϊ>
int getAfterStatus( vector<string> &full_vec,int equal,char *status, vector<string> &after_vec )
{
int ifail = 0, i =0, j=0;
logical flag = false;
for( i = 0; i <full_vec.size(); i++ )
{
if( stricmp(full_vec[i].c_str(), status) ==0 )
{
flag = true;
break;
}
}
if( flag )
{
if( equal == 0 )
{
for( j = i;j < full_vec.size(); j++ )
{
ECHO("Æðʼ:%d, full_vec[%d]:%s\n",i, j, full_vec[j].c_str());
after_vec.push_back(full_vec[j]);
}
}
else if( equal == 1 )
{
for( j = i+1;j < full_vec.size(); j++ )
{
ECHO("Æðʼ:%d, full_vec[%d]:%s\n",i, j, full_vec[j].c_str());
after_vec.push_back(full_vec[j]);
}
}
}
return ifail;
}
logical isInVec(vector<string> &full_vec,char *arg_status, int equal,char *status )
{
int ifail = 0, i =0, j=0;
logical isInclude = false;
vector<string> after_vec;
getAfterStatus(full_vec, equal, arg_status, after_vec);
for( i = 0; i < after_vec.size(); i ++ )
{
ECHO("after_vec[%d]:%s status:%s\n",i,after_vec[i].c_str(), status);
if( stricmp(after_vec[i].c_str(), status) ==0 )
{
isInclude = true;
break;
}
}
return isInclude;
}
int CycleBOM( tag_t bomline,char *process_owner, char *arg_status, vector<string> &status_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,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));
ITKCALL(WSOM_ask_release_status_list(child_rev_tag,&status_count,&status_tag_list));
//if( debug )
ECHO("status_count£º%d\n",status_count);
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",arg_status,status_type);
if( strcmp( process_owner, user_id ) ==0 )
{
if( isInVec(status_vec,arg_status,0,status_type) ) //>=
{
isInculde = true;
}
}
else if( strcmp( process_owner, user_id ) !=0 &&
stricmp( status_type,"H9_Released" ) != 0)
{
if( isInVec(status_vec,arg_status,1,status_type) ) //>
{
isInculde = true;
}
}
}
if( !isInculde )
{
ITKCALL(ITEM_ask_rev_id(child_rev_tag, child_rev_id));
ITKCALL(ITEM_ask_item_of_rev( child_rev_tag, &child_item_tag ));
ITKCALL(ITEM_ask_id( child_item_tag, child_item_id ));
string errMsg;
errMsg.assign(child_item_id).append("/").append(child_rev_id).append(" ³ÉÊì¶È²»·ûºÏ·¢²¼ÒªÇó");
errMap.insert(pair<string,int>(errMsg,ERROR_STATUS_ERROR));
}
}
else //working״̬
{
ECHO("ÎÞ״̬, £ºprocess_owner:%s, user_id:%s\n",arg_status,user_id);
if( strcmp( process_owner, user_id ) !=0 )
{
ITKCALL(ITEM_ask_rev_id(child_rev_tag, child_rev_id));
ITKCALL(ITEM_ask_item_of_rev( child_rev_tag, &child_item_tag ));
ITKCALL(ITEM_ask_id( child_item_tag, child_item_id ));
string errMsg;
errMsg.assign(child_item_id).append("/").append(child_rev_id).append(" ³ÉÊì¶È²»·ûºÏ·¢²¼ÒªÇó");
errMap.insert(pair<string,int>(errMsg,ERROR_STATUS_ERROR));
}
}
DOFREE(status_tag_list);
}
for( int i = 0; i < child_cnt; i++ )
{
ifail = CycleBOM(child_lines[i],process_owner, arg_status, status_vec, errMap, debug);
}
return ifail;
}
int HZ_Check_BOM_Condition(EPM_rule_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, user = 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]="";
tag_t bomWindow = NULLTAG, bom_top_line = NULLTAG, bom_config_rule = NULLTAG;
map<string,int> errMap;
vector<string> status_vec;
//map<string,string> zuhaoMap;
EPM_decision_t decision = EPM_go;
logical debug = true;
ECHO("*************************************************************\n");
ECHO("* HZ_Check_BOM_Condition is comming ! *\n");
ECHO("*************************************************************\n");
task_tag = msg.task;
if(task_tag == NULLTAG)
{
ifail = ITK_ok;
//goto end_handler;
return EPM_nogo;
}
tag_t rootTask = NULLTAG;
status_vec.clear();
status_vec.push_back("working");
status_vec.push_back("H9_M0");
status_vec.push_back("H9_M1");
status_vec.push_back("H9_M2");
status_vec.push_back("H9_P");
status_vec.push_back("H9_M3");
status_vec.push_back("H9_B");
status_vec.push_back("H9_D");
status_vec.push_back("H9_Released");
//»ñµÃ²ÎÊý
arg_cnt = TC_number_of_arguments(msg.arguments);
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;
}
}
}
}
if( strlen(arg_status) <2 )
{
string key_id;
key_id.assign("ȱÉÙstatus²ÎÊý");
errMap.insert(pair<string,int>(key_id,HANDLER_ARGUMENT_ERROR));
return EPM_nogo;
}
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));
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 ) );
CycleBOM(ebom_line,userid,arg_status,status_vec,errMap,debug);
ITKCALL(BOM_close_window(ebom_window));
}
}
}
DOFREE(attachments);
if( debug )
ECHO("DEBUG: errMap.size is %d\n", errMap.size());
if( errMap.size() > 0 )
decision = EPM_nogo;
else
decision = EPM_go;
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());
}
errMap.clear();
ECHO("\n************************************************************\n");
ECHO("* HZ_Check_BOM_Condition is end! *\n");
ECHO("*************************************************************\n");
return decision;
}