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.

609 lines
16 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.

/**
* @addtogroup workflow
* @{
*/
/**
* @file xy_create_material_code.cpp
*
* @brief create material code according to some rev master properties
*
* @author Ray Li
*
* @history
* ===================================================================================
* Date Name Description
* 27-Jul-2009 Ray created
*/
/**
* @remarks: handler usage description
*
* @Handler: xy-create-material-code
*
* @Description: This handler will assign some value to its form property
*
* @Syntax: xy-create-material-code -type=产品,零组件 -required_props=prop1,prop2,prop3 -sid_leng=3 -target_prop=target_prop_name [-debug=true|false]
* @Arguments: -type = ItemRevision types, like 产品,零组件
* specified target ItemRevision will be processed, others skipped,
* eg: 产品,零组件
*
* -target_prop = target property
* the new prop value assigned to this property
*
* -target_value = target property
* the new prop value assigned to this property
*
* -debug = true | false
* When the argument is set to 'true' (case-insensitive), there will be more messages written in the syslog file. The default value is false.
*
* @Placement: not specified
*
* @Restrictions: none
*
*/
#pragma warning (disable: 4996)
#pragma warning (disable: 4819)
/**
* @headerfile tcua 头文件
*/
#include <tccore/item.h>
#include <tccore/grmtype.h>
#include <tccore/grm.h>
#include <sa/am.h>
#include <tccore/aom.h>
#include <tccore/aom_prop.h>
#include <property/prop_errors.h>
#include <lov/lov_errors.h>
#include <lov/lov.h>
#include <tccore/tctype.h>
#include <res/res_itk.h>
/**
* @headerfile standard c & cpp header files
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <string>
#include <vector>
#include <map>
#include <fstream>
//#include <iostream>
using namespace std;
/**
* @headerfile user's header files
*/
#include "string_helper.h"
#include "itk_service_common.h"
#include "mdbks_register.h"
#include "error_handling.h"
static int CycleLovFilter( tag_t lov_tag, const char *prop_value, int lov_order, int filter_level, string &prop_desc )
{
int ifail = ITK_ok;
if (lov_tag == NULLTAG)
return ITK_ok;
else if ( prop_desc.size()==0 )
{
if (filter_level == lov_order)
{
int n_values = 0, lov_index = 0;
char **lov_values = NULL;
logical find_prop_value = FALSE;
ITKCALL( LOV_ask_values_string( lov_tag, &n_values, &lov_values ) );
for (int li=0; li<n_values; li++)
{
if (strcmp(lov_values[li], prop_value) == 0)
{
lov_index = li;
find_prop_value = TRUE;
break;
}
}
MEM_free(lov_values);
if (find_prop_value)
{
LOV_usage_t usage;
char **desc_strings = NULL;
logical *is_null = NULL;
logical *is_empty = NULL;
ITKCALL( LOV_ask_value_descriptions( lov_tag, &usage,
&n_values, &desc_strings, &is_null, &is_empty ) );
if (is_null[lov_index]==FALSE && is_empty[lov_index]==FALSE)
{
prop_desc.assign(desc_strings[lov_index]);
}
MEM_free(desc_strings);
MEM_free(is_null);
MEM_free(is_empty);
return ITK_ok;
}
}
else
{
int n_listOfFilters = 0, *listOfFiltersIndexes = NULL;
tag_t *listOfFilters = NULL;
ITKCALL( LOV_ask_value_filters( lov_tag, &n_listOfFilters, &listOfFiltersIndexes, &listOfFilters ) );
if (n_listOfFilters>0)
{
for (int li=0; li<n_listOfFilters; li++)
{
if (prop_desc.size()==0)
{
int new_filter_level = filter_level + 1;
ifail = CycleLovFilter( listOfFilters[li], prop_value, lov_order, new_filter_level, prop_desc );
}
else
break;
}
MEM_free( listOfFiltersIndexes );
MEM_free( listOfFilters );
}
}
}
return ifail;
}
static int FindPropLovDesc( tag_t object, const char *prop_name, PROP_value_type_t prop_type, string &prop_value )
{
if (object==NULLTAG)
return POM_inst_not_loaded;
prop_value.clear();
//数组属性统一处理
int max_prop_elems = 0;
ITKCALL( AOM_ask_max_num_elements( object, prop_name, &max_prop_elems ) );
if( max_prop_elems != 1 )
{
char *d_vlaue = NULL;
ITKCALL( AOM_UIF_ask_value( object, prop_name, &d_vlaue ) );
if (d_vlaue && *d_vlaue)
{
prop_value.assign(d_vlaue);
MEM_free(d_vlaue);
return ITK_ok;
}
}
else
{
if (prop_type == PROP_string)
{
tag_t prop_descriptor = NULLTAG;
ITKCALL( AOM_ask_descriptor( object, prop_name, &prop_descriptor ) );
logical is_lov_des_attached = FALSE;
ITKCALL( PROPDESC_is_lov_desc_attach( prop_descriptor, &is_lov_des_attached ) );
if (is_lov_des_attached) //如果当前属性已经是lov的描述则不再处理仅赋值给返回对象
{
char *str_value = NULL;
ITKCALL( AOM_ask_value_string( object, prop_name, &str_value ) );
if (str_value && *str_value)
{
prop_value.assign(str_value);
MEM_free(str_value);
}
}
else
{
char *str_value = NULL;
ITKCALL( AOM_ask_value_string( object, prop_name, &str_value ) );
if (str_value && *str_value) //仅在属性有值的情况下取其lov描述
{
tag_t lov_tag = NULLTAG;
ITKCALL( AOM_ask_lov( object, prop_name, &lov_tag ) );
if (lov_tag) //如果没有与属性关联的lov则不处理
{
int lov_order = 0;
char* object_type = NULL;
ITKCALL( WSOM_ask_object_type2( object, &object_type ) );
ITKCALL( LOV_ask_attached_dependency_order( object_type, prop_name, &lov_order ) );
string prop_desc;
CycleLovFilter(lov_tag, str_value, lov_order, 1, prop_desc );
if (prop_desc.size()>0)
prop_value.assign(prop_desc);
}
if (prop_value.size()==0)
{
prop_value.assign(str_value);
}
MEM_free(str_value);
return ITK_ok;
}
}
}
else if (prop_type == PROP_int)
{
int int_value = NULL;
ITKCALL( AOM_ask_value_int( object, prop_name, &int_value ) );
char buf[100] = "";
sprintf( buf, "%d", int_value );
prop_value.assign(buf);
}
}
return ITK_ok;
}
int xy_assign_form_props(EPM_action_message_t msg)
{
int ifail = ITK_ok;
logical is_debug = FALSE;
char buf[BUFSIZ] = "", *flag = NULL, *value = NULL;
//item master form relation type
tag_t master_form_rel_type = NULLTAG;
ITKCALL( GRM_find_relation_type( TC_master_form_rtype, &master_form_rel_type ) );
//parse some arguments
map<string,string> item_types_map;
map<string,string>::iterator item_types_map_iter = item_types_map.begin();
vector<string> required_props_vec;
int sid_leng = 0, max_sid = 0;
char target_prop[WSO_name_size_c + 1] = "";
char target_value[WSO_name_size_c + 1] = "";
int num_of_arguments = TC_number_of_arguments( msg.arguments );
for (int i=0; i<num_of_arguments; i++)
{
ITKCALL( ITK_ask_argument_named_value( TC_next_argument( msg.arguments ), &flag, &value ) );
printf( "value = %s\n", value );
if ( strcmp( flag, "type" ) == 0 && value != NULL )
{
vector<string> ans;
Split( value, ',', ans );
for (size_t j=0; j<ans.size(); j++)
{
printf("here\n");
item_types_map.insert(make_pair(ans[j],ans[j]));
}
}
//else if ( strcmp( flag, "required_props" ) == 0 && value != NULL )
//{
// vector<string> ans;
// Split( value, ',', ans ); printf( "ans size = %d\n", ans.size() );
// for (size_t j=0; j<ans.size(); j++)
// {
// required_props_vec.push_back(ans[j]);
// }
//}
//else if ( strcmp( flag, "sid_leng" ) == 0 && value != NULL )
//{
// sid_leng = atoi(value);
// max_sid = (int)(pow( 10.0, sid_leng )) - 1;
//}
else if ( strcmp( flag, "target_prop" ) == 0 && value != NULL )
{
strcpy( target_prop, value );
} //check debug indicator
else if ( strcmp( flag, "target_value" ) == 0 && value != NULL )
{
strcpy( target_value, value );
} //check debug indicator
else if( strcmp( flag, "debug" ) == 0 && value != NULL )
{
if( strcmp( value, "true" ) == 0 )
is_debug = TRUE;
}
MEM_free( flag );
MEM_free( value );
}
//STEP 1:
//check handler arguments
printf("11111111\n");
if (item_types_map.size()==0)
{
printf( ("type argument is not specified, please check!\n") );
printf("type argument is not specified, please check!\n");
return EPM_missing_req_arg;
}
//else if ( required_props_vec.size()==0)
//{
// LOG_ECHO( ("required_props argument is not specified, please check!\n") );
// return EPM_missing_req_arg;
//}
//else if ( sid_leng==0 )
//{
// LOG_ECHO( ("sid_leng argument is not valid, please check!\n") );
// return EPM_missing_req_arg;
//}
else if (strlen(target_prop)==0 )
{
printf( ("target_prop argument is not valid, please check!\n") );
printf("target_prop is not specified, please check!\n");
return EPM_missing_req_arg;
}
//logical prop_not_defined = FALSE;
//logical lov_has_no_value = FALSE;
//item_types_map_iter = item_types_map.begin();
//for (; item_types_map_iter!=item_types_map.end(); item_types_map_iter++)
//{
// tag_t item_type = NULLTAG;
// char item_type_class[TCTYPE_class_name_size_c+1] = "";
// ITKCALL( TCTYPE_find_type( item_types_map_iter->first.c_str(), NULL, &item_type ) );
// ITKCALL( TCTYPE_ask_class_name( item_type, item_type_class ) );
// if (strcmp( item_type_class, "Item" ) != 0)
// {
// sprintf( buf, "type %s not Item or its sub type%s\n", item_types_map_iter->first.c_str() );
// LOG_ECHO( (buf) );
// break;
// }
// char *rev_master_type_name = NULL;
// ITKCALL( ITEM_ask_rev_master_form_type( item_types_map_iter->first.c_str(), &rev_master_type_name ) );
// tag_t rev_master_type = NULLTAG;
// ITKCALL( TCTYPE_find_type( rev_master_type_name, NULL, &rev_master_type ) );
// for ( int ri=0; ri<(int)required_props_vec.size(); ri++)
// {
// char one_prop[WSO_name_size_c + 1] = "";
// strcpy( one_prop, required_props_vec[ri].c_str() );
// tag_t pd_tag = NULLTAG;
// ifail = TCTYPE_ask_property_by_name( rev_master_type, one_prop, &pd_tag );
// if (ifail != ITK_ok || pd_tag == NULLTAG)
// {
// sprintf( buf, "property %s not found from type %s\n", one_prop, rev_master_type_name );
// LOG_ECHO( (buf) );
// prop_not_defined = TRUE;
// break;
// }
// }
// if (!prop_not_defined)
// {
// tag_t pd_tag = NULLTAG;
// ifail = TCTYPE_ask_property_by_name( rev_master_type, target_prop, &pd_tag );
// if (ifail != ITK_ok || pd_tag == NULLTAG)
// {
// sprintf( buf, "property %s not found from type %s\n", target_prop, rev_master_type_name );
// LOG_ECHO( (buf) );
// prop_not_defined = TRUE;
// break;
// }
// }
// if (prop_not_defined)
// {
// break;
// }
//}
//if (prop_not_defined)
//{
// return PROP_no_properties;
//}
//if ( is_debug ) //print arguments specified for handler
//{
// item_types_map_iter = item_types_map.begin();
// for (; item_types_map_iter!=item_types_map.end(); item_types_map_iter++)
// {
// sprintf( buf, "Type: %s, ", item_types_map_iter->first.c_str() );
// LOG_ECHO( (buf) );
// }
// sprintf( buf, "\n" );
// LOG_ECHO( (buf) );
// for ( int ri=0; ri<(int)required_props_vec.size(); ri++)
// {
// sprintf( buf, "Prop: %s, ", required_props_vec[ri].c_str() );
// LOG_ECHO( (buf) );
// }
// sprintf( buf, "Prop: %s\n", target_prop );
// LOG_ECHO( (buf) );
// sprintf( buf, "Max Flow ID Leng: %d\n", max_sid );
// LOG_ECHO( (buf) );
//}
//STEP 2:
//retrieve item revisions related in reference's list
tag_t job = NULLTAG, root_task = NULLTAG;
ITKCALL( EPM_ask_job( msg.task, &job ) );
ITKCALL( EPM_ask_root_task( job, &root_task ) );
//current task's reference list
int reference_count = 0;
tag_t *reference_list = NULL;
ITKCALL( EPM_ask_attachments( root_task, EPM_target_attachment, &reference_count, &reference_list ) );
vector<tag_t> reference_revs_vec;
for (int ri=0; ri<reference_count; ri++)
{
printf("22222222\n");
tag_t class_id = NULLTAG;
ITKCALL( POM_class_of_instance( reference_list[ri], &class_id ) );
if ( class_id != NULLTAG )
{
char *class_name = NULL;
ITKCALL( POM_name_of_class( class_id, &class_name ) );
//TC8==================
//if ( class_name && *class_name && strcmp( class_name, "ItemRevision" ) == 0 )
if ( class_name && *class_name && strstr( class_name, "XY" ) != NULL )
{
tag_t item_tag = NULLTAG;
ITKCALL( ITEM_ask_item_of_rev( reference_list[ri], &item_tag ) );
char* item_type = NULL;
ITKCALL( ITEM_ask_type2( item_tag, &item_type ) );
if (item_types_map.find(item_type)!=item_types_map.end())
{
printf("33333333\n");
reference_revs_vec.push_back(reference_list[ri]);
}
}
MEM_free(class_name);
}
}
if (is_debug)
{
sprintf( buf, "Total %d objects will be processed\n", reference_revs_vec.size() );
printf( (buf) );
}
printf("444444444\n");
//处理所有的版本
for (int vi=0; vi<(int)reference_revs_vec.size(); vi++)
{
tag_t one_rev = reference_revs_vec[vi];
int form_count = 0;
tag_t *form_list = NULL, master_form = NULLTAG;
ITKCALL( GRM_list_secondary_objects_only( one_rev, master_form_rel_type, &form_count, &form_list ) );
master_form = form_list[0];
MEM_free(form_list);
//检查target_prop是否有值
//printf("55555555\n");
//logical is_null_empty = FALSE;
//ITKCALL( AOM_is_null_empty( master_form, target_prop, TRUE, &is_null_empty ) );
//if (!is_null_empty)
//{
// sprintf( "target prop %s had value already!\n", target_prop );
// LOG_ECHO( (buf) );
// continue;
//}
printf("6666666\n");
////检查JyErpNoSyncAppEPR编码申请是否为“申请”
//char *apply_value = NULL;
//ITKCALL( AOM_ask_value_string( master_form, "JyErpNoSyncApp", &apply_value ) );
//if ( apply_value && *apply_value && strcmp( apply_value, "不申请" ) == 0 )
//{
// MEM_free(apply_value);
// continue;
//}
//MEM_free(apply_value);
map<string,PROP_value_type_t> prop_type_map;
map<string,PROP_value_type_t>::iterator prop_type_map_iter;
////得到指定属性的值类型
//for ( int ri=0; ri<(int)required_props_vec.size(); ri++)
//{
// PROP_value_type_t valtype;
// char *valtype_n = NULL;
// ITKCALL( AOM_ask_value_type( master_form, required_props_vec[ri].c_str(), &valtype, &valtype_n ) );
// if (is_debug)
// {
// sprintf( buf, "prop type = %s\n", valtype_n );
// }
// MEM_free(valtype_n);
// prop_type_map.insert( make_pair(required_props_vec[ri], valtype) );
//}
/*得到指定的属性
string material_code_mark("");
for ( int ri=0; ri<(int)required_props_vec.size(); ri++)
{
prop_type_map_iter = prop_type_map.find(required_props_vec[ri]);
PROP_value_type_t valtype = prop_type_map_iter->second;
string prop_value;
FindPropLovDesc( master_form, required_props_vec[ri].c_str(), valtype, prop_value );
if (prop_value.size()>0)
{
material_code_mark.append(prop_value);
}
}
char *newID = NULL;
ITKCALL( SERVICE_internal_part_no( material_code_mark.c_str(), sid_leng, 1, max_sid, 1, &newID ) );
if (newID && *newID && strlen(newID)>0)
{
material_code_mark.assign(newID);
MEM_free(newID);
}
if (is_debug)
{
sprintf( buf, "new material code is %s\n", material_code_mark.c_str() );
LOG_ECHO( (buf) );
}*/
//检查写权限
printf("7777777\n");
logical can_change_form = FALSE;
ITKCALL( AM_check_privilege( master_form, "WRITE", &can_change_form ) );
if (can_change_form)
{
//PROP_value_type_t valtype;
//char *valtype_n = NULL;
//ITKCALL( AOM_ask_value_type( master_form, target_prop, &valtype, &valtype_n ) );
//if (is_debug)
//{
// sprintf( buf, "prop type = %s\n", valtype_n );
//}
//MEM_free(valtype_n);
//if (valtype == PROP_string)
//{
// tag_t prop_descriptor = NULLTAG;
// ITKCALL( AOM_ask_descriptor( object, prop_name, &prop_descriptor ) );
// logical is_lov_des_attached = FALSE;
// ITKCALL( PROPDESC_is_lov_desc_attach( prop_descriptor, &is_lov_des_attached ) );
// if (is_lov_des_attached) //如果当前属性已经是lov的描述则不再处理仅赋值给返回对象
// {
// //char *str_value = NULL;
// //ITKCALL( AOM_ask_value_string( object, prop_name, &str_value ) );
// //if (str_value && *str_value)
// //{
// // prop_value.assign(str_value);
// // MEM_free(str_value);
// //}
// }
//}
//TC8=============
//ITKCALL( AOM_lock( master_form ) );
//ITKCALL( AOM_set_value_string( master_form, target_prop, material_code_mark.c_str() ) );
ITKCALL(RES_checkout2(master_form,"","","",RES_EXCLUSIVE_RESERVE));
ITKCALL(RES_cancel_checkout (master_form,false));
ITKCALL( AOM_set_value_string( master_form, target_prop, target_value ) );
ITKCALL( AOM_save( master_form ) );
ITKCALL( AOM_unlock( master_form ) );
}
else
{
printf( ("reviewer has no write privilege to add attachment\n" ) );
return AM_insufficient_access;
}
}
return ITK_ok;
}