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.
xy2/mdbks_connor_itk/jy_create_material_code.cpp

1063 lines
30 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 jy_create_material_code.cpp
*
* @brief create material code according to some rev master properties
*
* @author James Pang
*
* @history
* ===================================================================================
* Date Name Description
* 27-Jul-2009 James created
* 03-Nov-2009 James modify EPM_reference_attachment to EPM_target_attachment
* 17-Nov-2009 James add check for JyErpNoSyncApp
* lwh lwh add -pre,-fixed_prop parameter
*/
/**
* @remarks: handler usage description
*
* @Handler: jy-create-material-code
*
* @Description: This handler will assign some value to its form property
*
* @Syntax: jy-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: 产品,零组件
*
* -required_props = prop1,prop2,prop3,...
* specified properties will be changed
*
* -sid_leng = 3
* material code sequence number's length
*
* -target_prop = 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.
* -pre = 4
* 截取合成后属性的前几位
*
* -fixed_prop = fixed property
* 截取后的属性名
*
* @Placement: not specified
*
* @Restrictions: none
*
*/
#pragma warning (disable: 4996)
#pragma warning (disable: 4819)
/**
* @headerfile tcua 头文件
*/
#include <property/propdesc.h>
#include <epm/epm.h>
#include <tccore/item.h>
#include <tccore/grmtype.h>
#include <tccore/grm.h>
#include <sa/role.h>
#include <tccore/imantype.hxx>
#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 <form/formtype.h>
#include <res/res_itk.h>
#include <epm/signoff.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 "mdbks_register.h"
#include "error_handling.h"
#include "string_helper.h"
#include "itk_service_common.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;
//printf("CycleLovFilter\n");
// if (lov_tag == NULLTAG)
// return ITK_ok;
// else if ( prop_desc.size()==0 )
// {
//printf("filter_level=%d,lov_order=%d\n",filter_level,lov_order);
// if (filter_level == lov_order)
// {
// int n_values = 0, lov_index = 0;
// char **lov_values = NULL;
// int *lov_int=0;
// logical find_prop_value = FALSE;
//
// ITKCALL( LOV_ask_values_string( lov_tag, &n_values, &lov_values ) );
//
// for (int li=0; li<n_values; li++)
// {
// printf("lov_values[li]=%s\n",lov_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;
// tag_t *values_tag = NULL;
// printf("开始取描述值\n");
// //ITKCALL( LOV_ask_lov_tag (lov_tag,&usage,&n_values,&values_tag,&is_null, &is_empty ) );
// //ITKCALL( LOV_ask_values_tag (lov_tag,&n_values,&values_tag) );
// //ITKCALL (LOV_is_value_valid_string (lov_tag,
// 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)
// {
// printf("find_prop_value desc_strings[lov_index]=%s\n",desc_strings[lov_index]);
// prop_desc.assign(desc_strings[lov_index]);
// printf("prop_desc=%s\n",prop_desc.c_str());
// }
// MEM_free(desc_strings);
// MEM_free(is_null);
// MEM_free(is_empty);
//
// return ITK_ok;
// }
// }
// else
// {
// printf("n_listOfFilters\n");
// 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;
// //if( listOfFilters[li]!=NULLTAG)
// 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 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();
// printf("prop_value.clear\n");
// //数组属性统一处理
// int max_prop_elems = 0;
// ITKCALL( AOM_ask_max_num_elements( object, prop_name, &max_prop_elems ) );
// if( max_prop_elems != 1 )
// {
// printf("max_prop_elems!=1\n");
// 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
// {
// printf("else\n");
// 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 ) );
// printf("is_lov_des_attached\n");
// if (is_lov_des_attached) //如果当前属性已经是lov的描述则不再处理仅赋值给返回对象
// {
// char *str_value = NULL;
// printf("当前属性已经是lov的描述\n");
// 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[WSO_name_size_c + 1] = "";
// 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 (lov_tag) //如果没有与属性关联的lov则不处理
// //{
// // int lov_order = 0;
//
// // char object_type[WSO_name_size_c + 1] = "";
// // ITKCALL( WSOM_ask_object_type2( object, object_type ) );
// // ITKCALL( LOV_ask_attached_dependency_order( object_type, prop_name, &lov_order ) );
// // string prop_desc;
// // if(lov_order==0)
// // {
// // int n_values = 0, lov_index = 0;
// // char **lov_values = NULL;
// // logical find_prop_value = FALSE;
// // LOV_usage_t usage;
// // char **desc_strings = NULL;
// // logical *is_null = NULL;
// // logical *is_empty = NULL;
// // printf("开始取描述值\n");
// // 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)
// // {
// // printf("desc_strings[lov_index]=%s\n",desc_strings[lov_index]);
// // prop_desc.assign(desc_strings[lov_index]);
// // }
// // MEM_free(desc_strings);
// // MEM_free(is_null);
// // MEM_free(is_empty);
// // }
// // else
// // {
// // //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 IncludeChinese(char *str)//返回0无中文返回1有中文
{
char c;
int n=0;
while(1)
{
c=*str++;
if (c==0) break; //如果到字符串尾则说明该字符串没有中文字符
if (c&0x80) //如果字符高位为1且下一字符高位也是1则有中文字符
{
if (*str & 0x80)
{
n++;
};
}
}
return n;
}
static int CycleLovFilter(map<int,string> &lov_rel_props_value, const char *prop_name,
tag_t lov_tag, int lov_order, int filter_level, const char *prop_value, string &prop_desc)
{
int ifail = ITK_ok;
if (lov_tag == NULLTAG)
return ITK_ok;
printf("prop_name = %s, prop_vlaue = %s, prop_desc = %s\n", prop_name, prop_value, prop_desc.c_str());
printf("prop_desc.size() = %d, filter_level = %d, lov_order = %d\n", prop_desc.size(), filter_level, lov_order);
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 current_level_value_index = 0;
map<int,string>::iterator current_order_value = lov_rel_props_value.find(filter_level);
//找到跟filter_level对应的属性值的索引
if (current_order_value != lov_rel_props_value.end())
{
logical find_secondary_level_index = 0;
int n_values = 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], current_order_value->second.c_str()) == 0)
{
current_level_value_index = li;
break;
}
}
MEM_free(lov_values);
//找到根filter_level索引值对应的子lov对象
int n_listOfFilters = 0, *listOfFiltersIndexes = NULL;
tag_t *listOfFilters = NULL;
ITKCALL( LOV_ask_value_filters( lov_tag, &n_listOfFilters, &listOfFiltersIndexes, &listOfFilters ) );
map<int,tag_t> filtersMap;
map<int,tag_t>::iterator filtersMapIter;
for (int li=0; li<n_listOfFilters; li++)
{
filtersMap.insert(make_pair(listOfFiltersIndexes[li], listOfFilters[li]));
}
MEM_free(listOfFilters);
MEM_free(listOfFiltersIndexes);
if ((filtersMapIter = filtersMap.find(current_level_value_index)) != filtersMap.end())
{
ifail = CycleLovFilter(lov_rel_props_value, prop_name, filtersMapIter->second, lov_order, filter_level+1, prop_value, prop_desc);
}
}
}
}
return ifail;
}
static int FindPropLovDesc( tag_t object, const char *prop_name, PROP_value_type_t prop_type, string &prop_value )
{
int ifail = ITK_ok;
char buf[BUFSIZ] = "";
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则不处理
{
map<int,string> lov_rel_props;
char* object_type = NULL;
ITKCALL( WSOM_ask_object_type2( object, &object_type ) );
//得到Form的存储类
//tag_t class_id = NULLTAG;
//ITKCALL( POM_class_of_instance( object, &class_id ) );
//char *class_name = NULL;
//ITKCALL( POM_name_of_class( class_id, &class_name ) );
//if (strcmp(class_name, "Form") == 0)
//{
// tag_t type_tag = NULLTAG;
// ITKCALL( TCTYPE_find_type( object_type, NULL, &type_tag ) );
// char *def_class_name = NULL;
// ITKCALL( FORMTYPE_ask_def_class_name( type_tag, &def_class_name ) );
// strcpy( object_type, def_class_name );
// MEM_free(def_class_name);
//}
//MEM_free(class_name);
//得到跟当前Form及LOV关联的所有属性
int n_attach = 0, *orders = NULL, *n_parents = NULL;
char **type_names = NULL, **prop_names = NULL;
logical *descAttaches = NULL;
ITKCALL( LOV_ask_attached_properties_info( lov_tag, &n_attach, &type_names, &prop_names, &orders, &n_parents, &descAttaches ) );
for (int ai=0; ai<n_attach; ai++)
{
if (strcmp(type_names[ai], object_type) == 0)
{
printf("orders[ai] = %d\n", orders[ai]);
lov_rel_props.insert(make_pair(orders[ai], prop_names[ai]));
}
}
MEM_free(orders);
MEM_free(n_parents);
MEM_free(descAttaches);
MEM_free(type_names);
MEM_free(prop_names);
map<int,string> lov_rel_props_value;
for (map<int,string>::iterator iter = lov_rel_props.begin(); iter != lov_rel_props.end(); iter++)
{
char *prop_value = NULL;
ITKCALL( AOM_ask_value_string(object, iter->second.c_str(), &prop_value) );
lov_rel_props_value.insert(make_pair(iter->first, prop_value));
MEM_free(prop_value);
}
int lov_order = 0;
ITKCALL( LOV_ask_attached_dependency_order( object_type, prop_name, &lov_order ) );
printf("lov_order = %d\n", lov_order);
string prop_desc;
CycleLovFilter( lov_rel_props_value, prop_name, lov_tag, lov_order, 1, str_value, 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 jy_create_material_code(EPM_action_message_t msg)
{
int ifail = ITK_ok;
logical is_debug = FALSE;
char fixed_prop[WSO_name_size_c + 1]="";
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, pre_len = 0;
char target_prop[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++)
{
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, "debug" ) == 0 && value != NULL )
{
if( strcmp( value, "true" ) == 0 )
is_debug = TRUE;
}
else if( strcmp( flag, "pre" ) == 0 && value != NULL )
{
//if( strcmp( value, "true" ) == 0 )
// is_debug = TRUE;
pre_len = atoi(value);
}
else if( strcmp( flag, "fixed_prop" ) == 0 && value != NULL )
{
//if( strcmp( value, "true" ) == 0 )
// is_debug = TRUE;
strcpy( fixed_prop, value );
}
MEM_free( flag );
MEM_free( value );
}
//STEP 1:
//check handler arguments
if (item_types_map.size()==0)
{
printf( ("type argument is not specified, please check!\n") );
return EPM_missing_req_arg;
}
else if ( required_props_vec.size()==0)
{
printf( ("required_props argument is not specified, please check!\n") );
return EPM_missing_req_arg;
}
else if ( sid_leng==0 )
{
printf( ("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") );
return EPM_missing_req_arg;
}
else if (pre_len==0 )
{
printf( ("pre argument is not valid, please check!\n") );
return EPM_missing_req_arg;
}
else if (strlen(fixed_prop)==0 )
{
printf( ("fixed_prop argument is not valid, 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,
parent_type_tag = NULLTAG;
char* item_type_class = NULL,
*parent_type_class = NULL;
ITKCALL( TCTYPE_find_type( item_types_map_iter->first.c_str(), NULL, &item_type ) );
ITKCALL( TCTYPE_ask_class_name2( item_type, &item_type_class ) );
printf("\nitem_type_class=%s\n",item_type_class);
ITKCALL( TCTYPE_ask_parent_type( item_type,&parent_type_tag) );
ITKCALL( TCTYPE_ask_class_name2( parent_type_tag, &parent_type_class ) );
//TC8==============================
//if (strcmp( parent_type_class, "Item" ) != 0)
//if (strcmp( item_type_class, "Item" ) != 0)
if (strstr(item_type_class,"XY")==NULL)
{
//sprintf( buf, "type %s not Item or its sub type%s\n", item_types_map_iter->first.c_str() );
sprintf( buf, "%s is not XY Item or its sub type%s\n", item_types_map_iter->first.c_str() );
printf( (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 );
printf( (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 );
printf( (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() );
printf( (buf) );
}
sprintf( buf, "\n" );
printf( (buf) );
for ( int ri=0; ri<(int)required_props_vec.size(); ri++)
{
sprintf( buf, "Prop: %s, ", required_props_vec[ri].c_str() );
printf( (buf) );
}
sprintf( buf, "Prop: %s\n", target_prop );
printf( (buf) );
sprintf( buf, "Max Flow ID Leng: %d\n", max_sid );
printf( (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++)
{
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 ) );
printf("\nclass_name=%s\n",class_name);
//TC8=======================
//if ( class_name && *class_name && strcmp( class_name, "ItemRevision" ) == 0 )
//if ( class_name && *class_name && strstr( class_name, "Revision" ) != 0 )
if ( class_name && *class_name && strstr( class_name, "XY" ) != NULL && strstr( class_name, "Revision" ) != 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())
{
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( "111111111\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是否有值
//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 );
// printf( (buf) );
// continue;
//}
////检查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);
char *apply_value = NULL;
ITKCALL( AOM_ask_value_string( master_form, "ItemIsERP", &apply_value ) );
if(stricmp(apply_value,"true") == 0)
{
MEM_free(apply_value);
continue;
}
char *target_value = NULL;
ITKCALL( AOM_ask_value_string( master_form, target_prop, &target_value ) );
//如果有值则不写
if(strcmp(target_value,"") != 0)
{
MEM_free(target_value);
continue;
}
//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;
//得到指定属性的值类型
printf( "222222222\n" );
for ( int ri=0; ri<(int)required_props_vec.size(); ri++)
{
printf( "required_props_vec[ri]=%s\n",required_props_vec[ri].c_str() );
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) );
}
printf( "3333333333\n" );
//得到指定的属性
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]);
printf( "prop_type_map_iter\n" );
PROP_value_type_t valtype = prop_type_map_iter->second;
string prop_value;
ITKCALL(RES_checkout2(master_form,"","","",RES_EXCLUSIVE_RESERVE));
ITKCALL(RES_cancel_checkout (master_form,false));
printf( "=============FindPropLovDesc\n" );
FindPropLovDesc( master_form, required_props_vec[ri].c_str(), valtype, prop_value );
printf( "FindPropLovDesc=============\n" );
if (prop_value.size()>0)
{
material_code_mark.append(prop_value);
}
}
printf( "material_code_mark=%s\n",material_code_mark.c_str() );
if(material_code_mark.empty())
{
printf( ("编码未指定, please check!\n") );
return EPM_task_not_complete;
}
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)
{
printf("newID=%s\n",newID);
//sprintf(newID,"%s测试","lala");
if(IncludeChinese(newID)>0)
{
printf("物料编码:%s,含有中文,请联系系统管理员解决此问题!\n",newID);
return EPM_task_not_complete;
}
material_code_mark.assign(newID);
MEM_free(newID);
}
if (is_debug)
{
sprintf( buf, "new material code is %s\n", material_code_mark.c_str() );
printf( (buf) );
}
//检查写权限
logical can_change_form = FALSE;
ITKCALL( AM_check_privilege(master_form, "WRITE", &can_change_form ) );
PROP_protection_t protection;
tag_t prop_tag=NULLTAG;
ITKCALL(TCTYPE_ask_property_by_name(master_form, target_prop, &prop_tag));
//=========================权限放开
if (can_change_form)
{
//TC8==============
ITKCALL(AOM_load (master_form) );
ITKCALL(RES_checkout2(master_form,"","","",RES_EXCLUSIVE_RESERVE));
ITKCALL(RES_cancel_checkout (master_form,false));
//ITKCALL( AOM_unlock( master_form ) );
//ITKCALL( AOM_lock( master_form ) );
//logical on_or_off=true;
printf("material_code_mark = %s\n",material_code_mark.c_str());
printf("target_prop = %s\n",target_prop);
//ITKCALL( PROPDESC_set_protection (prop_tag,PROP_write) );
//char *prop_value=NULL;
//ITKCALL( AOM_ask_value_string(master_form,target_prop,&prop_value));
//printf("prop_value=%s\n",prop_value);
ITKCALL( AOM_set_value_string( master_form, target_prop, material_code_mark.c_str() ) );
ITKCALL( AOM_save( master_form ) );
ITKCALL( AOM_unlock( master_form ) );
//fixed_prop
char temp_code[64]="";
strncpy(temp_code,material_code_mark.c_str(),pre_len);
strcat(temp_code,"\0");
//TC8==============
ITKCALL(AOM_load (master_form) );
//ITKCALL( AOM_unlock( master_form ) );
//ITKCALL( AOM_lock( master_form ) );
//ITKCALL( PROPDESC_set_protection (prop_tag,PROP_write));
ITKCALL( AOM_set_value_string( master_form, fixed_prop, temp_code ) );
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;
}