#include "handler.h" #define ARGS_LENGTH 200 #define MAX_PRINTLINE_LENGTH 2000 #define MAX_PATH_LENGTH 2000 #define MAX_ARGUMENT_LENGTH 400 #define MAX_PARAMNAME_LENGTH 50 #define MAX_FILE_EXT_LENGTH 10 #define TRUE_FLAG 1 #define FALSE_FLAG 0 #define DETAILLOG 1 #define DOFREE(obj) \ { \ if(obj) \ { \ MEM_free(obj); \ obj = NULL; \ } \ } int delete_release_status(EPM_action_message_t msg) { int ifail = ITK_ok, att_cnt = 0, rel_cnt = 0; EPM_target_attachment; tag_t task = NULLTAG, rootTask_tag = NULLTAG, *attchments = NULL, *releases = NULL, release_status = NULL; ITKCALL(EPM_ask_root_task(msg.task, &rootTask_tag)); ITKCALL(EPM_ask_attachments(rootTask_tag, EPM_target_attachment, &att_cnt, &attchments)); POM_AM__set_application_bypass(true); for (int i = 0; i < att_cnt; i++) { ITKCALL(AOM_ask_value_tags(attchments[i], "release_status_list", &rel_cnt, &releases)); for (int j = rel_cnt - 1; j > -1; j--) { EPM_remove_status_from_targets(releases[j], rootTask_tag); } } POM_AM__set_application_bypass(false); return ifail; } /* * 获取包含中文字符的字符串长度 */ int getCharLength(char str[]) { int count = 0; for (int i = 0; str[i]; i++) { if (str[i] < 0) i++; count++; } return count; } //发布对象 int set_release_status(tag_t item, char release_name[]) { int ifail = ITK_ok; tag_t release_status = NULL; ITKCALL(ifail = RELSTAT_create_release_status(release_name, &release_status)); ITKCALL(ifail = RELSTAT_add_release_status(release_status, 1, &item, TRUE)); return ifail; } bool contans(const char* types, char* type) { vector ans; Split(types, ",", ans); //判断类型 for (int i = 0; i < ans.size(); i++) { if (strcmp(ans[i].c_str(), type) == 0) { return true; } } return false; } int reviseDesignPost(METHOD_message_t* msg, va_list va) { int ifail = ITK_ok, rev_cnt = 0; tag_t new_rev = va_arg(va, tag_t); tag_t item = NULLTAG; tag_t* rev_list = NULLTAG; POM_AM__set_application_bypass(true); //力源对象版本升版后操 char* type; ITKCALL(AOM_ask_value_string(new_rev, "object_type", &type)); ITKCALL(ITEM_ask_item_of_rev(new_rev, &item)); ITKCALL(AOM_ask_value_tags(item, "revision_list", &rev_cnt, &rev_list)); tag_t pre_rev = rev_list[rev_cnt - 2]; //获取首选项匹配类型 int cnt = 0; char** vals = NULL; //获取首选项的值 PREF_ask_char_values("LY6_ReviseDesignPost", &cnt, &vals); for (int i = 0; i < cnt; i++) { char* val = vals[i]; vector ans; Split(val, "=", ans); //判断类型 if (strcmp(ans[0].c_str(), type) == 0) { printf("%s升版后操开始执行\n", &type); //获取关系 int wlcount = 0; tag_t* wltags; ITKCALL(AOM_ask_value_tags(pre_rev, ans[1].c_str(), &wlcount, &wltags)); for (int j = 0; j < wlcount; j++) { char* wltype; ITKCALL(AOM_ask_value_string(wltags[j], "object_type", &wltype)); //匹配关系对象类型 if (contans(ans[2].c_str(), wltype)) { tag_t wlobj; ITKCALL(ITEM_ask_item_of_rev(wltags[j], &wlobj)); if (wlobj != NULL) { //获取最新版本 tag_t newwlrev; int status = ITEM_ask_latest_rev(wlobj, &newwlrev); if (status == ITK_ok) { printf("start 开始删除关系\n"); tag_t gx_gx_type = NULLTAG; tag_t gx_relation = NULLTAG; ITKCALL(GRM_find_relation_type(ans[1].c_str(), &gx_gx_type)); GRM_find_relation(new_rev, wltags[j], gx_gx_type, &gx_relation); GRM_delete_relation(gx_relation); printf("end 删除关系完毕\n"); printf("start 开始添加关系\n"); tag_t relation = NULLTAG; ITKCALL(GRM_create_relation(new_rev, newwlrev, gx_gx_type, NULLTAG, &relation)); ITKCALL(GRM_save_relation(relation)); printf("end 添加关系完毕\n"); } } } } break; } } POM_AM__set_application_bypass(false); return ifail; } bool isTypeOf1(tag_t objtag, const char* type_name) { tag_t type = NULLTAG; TCTYPE_ask_object_type(objtag, &type); tag_t item_type = NULLTAG; TCTYPE_find_type(type_name, "", &item_type); bool is_type = false; if (item_type != NULLTAG) { logical isok = FALSE; TCTYPE_is_type_of(type, item_type, &isok); if (isok) { is_type = true; } } return is_type; } /** * @brief 根据不确定类型的tag_t对象,获取item和itemRev对象 * @param check_tag * @param item_tag * @param rev_tag * @return */ int get_item_and_rev(tag_t check_tag, tag_t* item_tag, tag_t* rev_tag) { int ifail = ITK_ok; if (isTypeOf1(check_tag, "Item")) { printf("====当前处理的对象是item对象!\n"); *item_tag = check_tag; ITEM_ask_latest_rev(*item_tag, rev_tag); } else if (isTypeOf1(check_tag, "ItemRevision")) { printf("====当前处理的对象是Revision对象!\n"); *rev_tag = check_tag; ITEM_ask_item_of_rev(*rev_tag, item_tag); } return ifail; } std::vector split(const std::string& str, char delimiter) { std::vector tokens; std::string token; std::istringstream tokenStream(str); while (std::getline(tokenStream, token, delimiter)) { tokens.push_back(token); } return tokens; } /*检查对象属性唯一性校验:item和itemRev对象前操都会走这个方法*/ int Connor_checkItem_unique(METHOD_message_t* msg, va_list va) {//创建item生效 int ifail = ITK_ok; char* type; char* name; char* itemID; printf("=================================================================================================== \n"); printf("=========触发前操校验唯一性方法==METHOD_find_method('Item/ItemRevision', 'IMAN_save', &mth_tag);\n"); tag_t check_tag = va_arg(va, tag_t);//获取要保存的tag对象 tag_t item_tag = NULLTAG; tag_t rev_tag = NULLTAG; ITKCALL(ifail = get_item_and_rev(check_tag, &item_tag, &rev_tag)); if (item_tag == NULLTAG) { printf("通过check_tag对象获取item对象失败!\n"); return ITK_ok; } else if (rev_tag == NULLTAG) { printf("通过check_tag对象获取rev对象失败!\n"); return ITK_ok; } //操作对象的类型 ITKCALL(ifail = AOM_ask_value_string(check_tag, "object_type", &type)); ITKCALL(ifail = AOM_ask_value_string(check_tag, "object_name", &name)); ITKCALL(ifail = AOM_ask_value_string(check_tag, "item_id", &itemID)); printf("===当前操处理对象的type = %s\n", type); //获取首选项 int url_num = 0; char** url_vals = NULL; ITKCALL(PREF_ask_char_values("LY6_MultiFieldKeys", &url_num, &url_vals)); if (url_num == 0) { printf("LY6_MultiFieldKeys首选项获取失败!\n"); }else{ printf("LY6_MultiFieldKeys首选项获取成功!\n"); for (int i = 0; i < url_num; i++) { printf("==>url_vals[%d] = %s\n", i, url_vals[i]); } //===================1开始根据首选项中的配置信息校验对象属性======================================================================================================= for (int i = 0; i < url_num; i++) { string multiFieldKey = "";//逐行取出首选项中的每一条配置信息 if (url_vals != nullptr && url_vals[i] != nullptr) { multiFieldKey.assign(url_vals[i]); // LY6_Product:MFK_LY6_Product=item.object_desc.string:object_desc,... } size_t posColon = multiFieldKey.find(":"); if (posColon != std::string::npos) { string compareType = multiFieldKey.substr(0, posColon); // 获取首选项中每条记录前的比较类型:LY6_Product printf("首选项中获取的compareType = %s\n", compareType.c_str()); if (stricmp(type, compareType.c_str()) == 0) { // 如果操作对象的类型type匹配compareType,开始获取属性并调用查询进行验证唯一性 printf(">>>当前操作对象的类型:%s,与首选项中的一条multiFieldKey匹配=========%s\n", type, multiFieldKey.c_str()); string afterCompare = multiFieldKey.substr(posColon + 1);//MFK_LY6_Product=item.obiect_desc.string:obiect_desc,... size_t posEqual = afterCompare.find("="); printf("afterCompare = %s\n", afterCompare.c_str()); //-----------------------------------1KUMA shangmiandaimameiwenti--------------------- if (posEqual != std::string::npos) { // 提取查询构建器的名称 string cx_name = afterCompare.substr(0, posEqual);//cx_name = MFK_LY6_Product tag_t query; ITKCALL(ifail = QRY_find2(cx_name.c_str(), &query)); printf("》》》成功获取到查询构建器query_name==%s\n", cx_name.c_str()); // 获取查询构建器的查询属性条目和值,每个查询条目保存到vector中 string compare_attribute = afterCompare.substr(posEqual + 1); //item.obiect_desc.string:obiect_desc,rev... vector compare_attr_vals = split(compare_attribute, ','); int qry_num = compare_attr_vals.size();//查询属性条目个数 //------------------------------------KUMA shangmiandaimameiwenti-------------------------------------------------------- char** qry_entries = new char* [qry_num]; char** qry_values = new char* [qry_num]; int n_found; tag_t* tags; int i = 0; for each (string var in compare_attr_vals) {//var就是一个查询条目item.obiect_desc.string:obiect_desc string cx_tm = split(var, ':')[1];//查询构建器条目obiect_desc printf(">>>获取到查询构建器的查询条目:%s \n", cx_tm.c_str()); string attribute = split(var, ':')[0];//item.obiect_desc.string string attribut_type = split(attribute, '.')[0];//item string attribute_name = split(attribute, '.')[1];//obiect_desc string attribute_t = split(attribute, '.')[2];//string char* attribute_value = NULL;//属性值 if (stricmp(attribut_type.c_str(), "item") == 0) {//如果当前属性是item属性 char* itemArr = NULL; ITKCALL(ifail = AOM_ask_value_string(item_tag, "object_name", &itemArr)); printf("开始根据item属性==[%s]获取属性值\n", attribute_name.c_str()); ITKCALL(ifail = AOM_ask_value_string(item_tag, attribute_name.c_str(), &attribute_value)); printf("item属性string类型(属性名)==%s,获取得到的属性值==%s\n", attribute_name.c_str(), attribute_value); MEM_free(itemArr); } else {//非item属性,即rev属性 char* revArr = NULL; ITKCALL(ifail = AOM_ask_value_string(rev_tag, "object_name", &revArr)); printf("开始根据revision==【%s】的属性==[%s]获取属性值\n",revArr, attribute_name.c_str()); ITKCALL(ifail = AOM_ask_value_string(rev_tag, attribute_name.c_str(), &attribute_value)); printf("revision属性string类型(属性名)==%s,获取得到的属性值==%s\n", attribute_name.c_str(), attribute_value); MEM_free(revArr); } //已经得到属性值attribute_value if (attribute_value == NULL) { printf("属性获取失败!\n"); } else { printf("属性获取成功qry_values[%d]==%s \n", i, attribute_value); qry_entries[i] = (char*)calloc(48, sizeof(char)); if (!cx_name.empty()) { tc_strcpy(qry_entries[i], cx_tm.c_str()); } qry_values[i] = (char*)calloc(48, sizeof(char)); if (attribute_value != nullptr && strlen(attribute_value) > 0) { tc_strcpy(qry_values[i], attribute_value); } } printf("写入属性条目数据后的数组:\n"); printf(">>>qry_entries[%d]==%s >>>qry_values[%d]==%s\n", i, qry_entries[i], i, qry_values[i]); i++; if (attribute_value != NULL) { MEM_free(attribute_value); } else { printf("TNND!"); } } //-------------------------------------KUMA 上面代码没问题!--------------------------------------------------------- printf("开始调用查询构建器,查询条目数量:%d,具体查询条目如下:\n", qry_num); for (int j = 0; j < qry_num; j++) { printf("》》》传入查询构建器的键值对:qry_entries[%d]:%s = qry_values[%d]:%s\n", j, qry_entries[j], j, qry_values[j]); } ITKCALL(ifail = QRY_execute(query, qry_num, qry_entries, qry_values, &n_found, &tags)); //释放数组内存 for (int j = 0; j < qry_num; j++) { delete[] qry_values[j]; delete[] qry_entries[j]; } delete[] qry_values; delete[] qry_entries; printf(">>>查询结果条数:%d\n", n_found); //-------------------------------------KUMA 上面代码没问题!------------------------------------------------------- if (n_found > 0) { //if (n_found == 1) { // char* itemId = NULL; // printf("查询结果条数 == 1,判断是否是自身!\n"); // tag_t se = tags[0]; // ITKCALL(ifail = AOM_ask_value_string(se, "item_id", &itemId)); // printf(">>>>查询构建器查询到的对象itemId==[%s]\n", itemId); // printf(">>>>当前正在操作的对象itemID==[%s]\n", itemID); // if (strcmp(itemId, itemID) == 0) {//查询到的就是自身 // printf("查询到的结果的item_id == [%s],当前操作的对象item_id == [%s],仅包含自身--允许放行!\n", itemId, itemID); // break; // } // printf("1 \n"); // if (itemId != NULL) { MEM_free(itemId); } // else { printf("TNND!"); } //} //printf("查询构建器查询到已存在相同属性的数据,不允许创建!\n"); ////--------------------------------KUMA 上面代码没问题!------------------------------------------------------------------------ //char errs[2500] = "\0"; //sprintf(errs, "对象[%s]中的首选项配置属性不唯一请检查!!", name); //EMH_store_error_s1(EMH_severity_information, 919012, errs);//错误弹窗 //printf(">>>返回错误提示!\n"); //ifail = -1; //break; for (int i = 0; i < n_found;i++) { char* itemId = NULL; ITKCALL(ifail = AOM_ask_value_string(tags[i], "item_id", &itemId)); if (strcmp(itemId, itemID) == 0) {//查询到的就是自身 printf("查询到的结果的item_id == [%s],当前操作的对象item_id == [%s],仅包含自身--允许放行!\n", itemId, itemID); MEM_free(itemId); continue; }else { char errs[2500] = "\0"; sprintf(errs, "对象[%s]中的首选项配置属性不唯一请检查!!", name); EMH_store_error_s1(EMH_severity_information, 919012, errs);//错误弹窗 printf(">>>返回错误提示!\n"); ifail = -1; MEM_free(itemId); break; } } if (ifail == -1) { break; } } else { printf("属性唯一校验通过!\n"); break; } } else { printf("未在首选项配置信息::%s中找到符号‘=’。\n", multiFieldKey.c_str()); } break; }else{ printf(">>>当前操作对象的类型:%s,与首选项中的配置类型:%s不匹配=========\n", type, compareType.c_str()); } } else { printf("未在首选项配置信息::%s中找到冒号,无法正常取得比较类型。\n", multiFieldKey.c_str()); } } } if (url_vals != NULL) { MEM_free(url_vals); } else { printf("TNND!"); } if (itemID != NULL) { MEM_free(itemID); } else { printf("TNND!"); } if (name != NULL) { MEM_free(name); } else { printf("TNND!"); } if (type != NULL) { MEM_free(type); } else { printf("TNND!"); } printf("==>beybey! \n"); return ifail; } /** * 检查关系下对象状态 * @param msg */ int rule_handler_LY_CheckItem(EPM_rule_message_t msg) { printf(">>>触发规则处理器:rule_handler_LY_CheckItem。开始检查关系下对象状态!\n"); int ifail = ITK_ok; tag_t* attachmentTags = NULL,//流程目标下的所有对象 attachmentTag = NULLTAG;//流程目标下的某一个对象 int attachmentCount = 0; int i = 0; //流程下的参数 char* itemTypeValue = (char*)MEM_alloc(1028 * sizeof(char)); char* relationValue = (char*)MEM_alloc(1028 * sizeof(char)); char* itemChildTypeValue = (char*)MEM_alloc(1028 * sizeof(char)); char* itemChildRevValue = (char*)MEM_alloc(1028 * sizeof(char));//配置参数:需要检查的版本-单值 char* releaseStatusValue = (char*)MEM_alloc(1028 * sizeof(char)); tag_t rootTask = NULLTAG; char* arg = NULL, * argName = NULL, * argValues = NULL; ITKCALL(ifail = EPM_ask_root_task(msg.task, &rootTask)); ITKCALL(ifail = EPM_ask_attachments(rootTask, EPM_target_attachment, &attachmentCount, &attachmentTags)); //获取流程目标下的参数(5个) int argCnt = TC_number_of_arguments(msg.arguments); if (argCnt > 0) { for (i = 0; i < argCnt; i++) { arg = TC_next_argument(msg.arguments); ITKCALL(ifail = ITK_ask_argument_named_value((const char*)arg, &argName, &argValues)); printf("处理流程下的参数:argName[%s]->argValue[%s]\n", argName, argValues); if (tc_strcmp("itemType", argName) == 0) { itemTypeValue = argValues; printf(">>>argValues[%s] TO itemTypeValue[%s]\n", argValues, itemTypeValue); } else if (tc_strcmp("Relation", argName) == 0) { tc_strcpy(relationValue, argValues); printf(">>>argValues[%s] TO relationValue[%s]\n", argValues, relationValue); } else if (tc_strcmp("itemChildType", argName) == 0) { tc_strcpy(itemChildTypeValue, argValues); printf(">>>argValues[%s] TO itemChildTypeValue[%s]\n", argValues, itemChildTypeValue); } else if (tc_strcmp("itemChildRev", argName) == 0) { tc_strcpy(itemChildRevValue, argValues); printf(">>>argValues[%s] TO itemChildRevValue[%s]\n", argValues, itemChildRevValue); } else if (tc_strcmp("releaseStatus", argName) == 0) { tc_strcpy(releaseStatusValue, argValues); printf(">>>argValues[%s] TO releaseStatusValue[%s]\n", argValues, releaseStatusValue); } } } else { printf("》》》未在流程下获取到任何配置参数!\n"); } printf("获取到的流程下的参数:itemTypeValue==%s,relationValue==%s,itemChildTypeValue==%s,itemChildRevValue==%s,releaseStatusValue==%s \n", itemTypeValue, relationValue, itemChildTypeValue, itemChildRevValue, releaseStatusValue); //逐个遍历所有的流程目标下的对象 for (i = 0; i < attachmentCount; i++) { tag_t item_tag = NULLTAG; tag_t rev_tag = NULLTAG; char* objectType = NULL; char* objectName = NULL; char* result = NULL; int tag_num = 0; tag_t* relation_tags = NULL; attachmentTag = attachmentTags[i]; //获取流程下某一对象的item_tag和rev_tag以及对象类型和名称 ITKCALL(ifail = get_item_and_rev(attachmentTag, &item_tag, &rev_tag)); ITKCALL(ifail = AOM_ask_value_string(attachmentTag,"object_type", &objectType)); ITKCALL(ifail = AOM_ask_value_string(attachmentTag,"object_name", &objectName)); printf("当前遍历的流程下对象类型为:objectType==%s\n", objectType); if (itemTypeValue != NULL) { printf(">>>配置参数:-itemType === %s \n", itemTypeValue); result = strstr(itemTypeValue, objectType); } if (result == nullptr) {//不存在 printf("当前流程下的对象类型==%s不在配置的类型参数==%s中,放行当前对象【%s】。\n", objectType, itemTypeValue,objectName); continue; }else{ printf("流程下的当前对象的类型==[%s]与itemType参数中的信息==[%s]匹配,开始获取被检查对象 == [%s]!\n", objectType, itemTypeValue, objectName); vector relations = split(relationValue, ','); printf(">>>配置参数:-Relation === %s \n", relationValue); for (string relation : relations) { tag_t relation_tag = NULL; printf("开始GET对象==[%s]的[%s]关系下的(被检查)对象们\n", objectName,relation.c_str()); ITKCALL(ifail = AOM_ask_value_tags(attachmentTag, relation.c_str(),&tag_num,&relation_tags)); if (tag_num > 0) { for (int i = 0; i < tag_num; i++) { printf("开始循环遍历[%s]关系下的“被检查对象”,关系下共有%d个被检查对象\n",relation.c_str(), tag_num); char* relation_child_type = NULL;//被检查对象类型 char* relation_child_rev = NULL;//被检查对象版本号 tag_t* relation_child_release = NULL;//被检查对象的发布状态数组 int release_num = 0; relation_tag = relation_tags[i];//被检查对象 ITKCALL(ifail = AOM_ask_value_string(relation_tag, "object_type", &relation_child_type)); ITKCALL(ifail = AOM_ask_value_string(relation_tag, "item_revision_id", &relation_child_rev)); ITKCALL(ifail = AOM_ask_value_tags(relation_tag, "release_status_list",&release_num, &relation_child_release)); vector itemChildTypes = split(itemChildTypeValue, ','); printf(">>>配置参数:-itemChildTypeValue === %s \n", itemChildTypeValue); int tagR = 0; for (string itemChildType : itemChildTypes) { if (stricmp(itemChildType.c_str(), relation_child_type) == 0) {//被检查对象的类型[relation_child_type]与参数[itemChildTypes]中匹配 printf(">>>流程对象:%s下的被检查对象类型:%s 与参数::%s中匹配!允许发起\n", objectName,relation_child_type, itemChildTypeValue); if (itemChildRevValue != NULL && stricmp(itemChildRevValue,"")!=0) { printf(">>>配置的参数版本号:%s\n", itemChildRevValue); if (stricmp(itemChildRevValue, relation_child_rev) != 0) {//配置的被检查对象版本参数只有一个 printf("被检查对象的版本不在配置的版本参数中,不允许发起"); char* error_msg = objectName; strcat(error_msg, "对象下关系绑定对象不正确,请检查!"); EMH_store_error_s1(EMH_severity_error, EMH_USER_error_base, error_msg); return EPM_nogo; } } else { printf(">>>首选项中配置的参数版本号:[%s]为空!\n", itemChildRevValue); } if (releaseStatusValue != NULL && stricmp(releaseStatusValue, "") != 0) { if (stricmp(releaseStatusValue,"none") == 0) { printf(">>>配置的发布状态为:none\n"); if (release_num > 0) {//被检查对象有发布状态,不发起 printf("当配置的发布状态为none时,被检查对象的发布状态有值,不允许发起"); char* error_msg = objectName; strcat(error_msg, "对象下关系绑定对象不正确,请检查!"); EMH_store_error_s1(EMH_severity_error, EMH_USER_error_base, error_msg); return EPM_nogo; } }else {//配置的发布状态参数有值,且不为none printf(">>>配置的参数:发布状态:%s\n", releaseStatusValue); if (release_num > 0) {//被检查对象有发布状态,开始检查 int k = 0; for (int j = 0; j < release_num; j++) {//遍历被检查对象的发布状态 printf("开始循环遍历被检查对象的发布状态,发布状态有%d个\n", release_num); char* relation_child_release_value = NULL;//被检查对象的发布状态的其中一个的名称 tag_t child_release = relation_child_release[j]; ITKCALL(ifail = AOM_ask_value_string(child_release, "current_name", &relation_child_release_value)); if (strstr(releaseStatusValue, relation_child_release_value) == nullptr) {//被检查对象的发布状态中,任一【child_release】不在配置的参数releaseStatusValue中,不发起 printf("被检查对象的发布状态数组中,任一【%s】不在配置的参数releaseStatusValue【%s】中,不发起! \n", relation_child_release_value, releaseStatusValue); char* error_msg = objectName; strcat(error_msg, "对象下关系绑定对象不正确,请检查!"); EMH_store_error_s1(EMH_severity_error, EMH_USER_error_base, error_msg); return EPM_nogo; } MEM_free(relation_child_release_value); } } else { printf("被检查对象的发布状态数组为空,不满足配置!\n"); char* error_msg = objectName; strcat(error_msg, "被检查对象的发布状态数组为空,不满足配置!"); EMH_store_error_s1(EMH_severity_error, EMH_USER_error_base, error_msg); return EPM_nogo; } } } tagR++; } } if (tagR == 0) {//当前被检查对象类型不在参数中,则不执行 printf("流程下对象的关系下的“被检查对象”中,不存在与itemchildtype参数中匹配的对象,不可发起! \n"); char* error_msg = objectName; strcat(error_msg, "对象下关系绑定对象不正确,请检查!"); EMH_store_error_s1(EMH_severity_error, EMH_USER_error_base, error_msg); return EPM_nogo; } MEM_free(relation_child_release); MEM_free(relation_child_rev); MEM_free(relation_child_type); } } else { printf("流程下当前[%s]对象的[%s]关系下不存在“被检查对象”,拦截\n", objectName, relation.c_str()); return EPM_nogo; } MEM_free(relation_tags); } } MEM_free(objectName); MEM_free(objectType); } MEM_free(argValues); MEM_free(argName); MEM_free(attachmentTags); return EPM_go; } int Connor_ItemRevision_Save(METHOD_message_t* msg, va_list va) { int ifail = ITK_ok; tag_t new_rev = va_arg(va, tag_t); tag_t item = NULLTAG; tag_t* rev_list; char* type = NULL; char* desc = NULL; printf("图纸保存后操作\n"); ITKCALL(ITEM_ask_item_of_rev(new_rev, &item)); //获取首选项 int url_num = 0; char** url_vals = NULL; ITKCALL(PREF_ask_char_values("connor_CheckMaterialDesc", &url_num, &url_vals)); char* pref = url_vals[0]; printf("pref=========%s\n", pref); if (item != NULLTAG) { ITKCALL(AOM_ask_value_string(item, "object_type", &type)); printf("object_type=========%s\n", type); if (strstr(pref, type)) { ITKCALL(AOM_ask_value_string(new_rev, "ly6_materialDesc", &desc)); printf("desc=========%s\n", desc); // 计算字符串长度 //size_t length = strlen(desc); int count = getCharLength(desc); printf("count=========%d\n", count); // 判断字符串长度是否超过40个字符 if (count > 40) { EMH_store_error_s2(EMH_severity_error, 919012, "提示", "物料描述不能超过40个字符,请检查后重新输入!"); return -1; } } } return 0; } // //int Connor_CreateItemPost(METHOD_message_t* msg, va_list va) //{ // // char* desc = NULL; // char* type = NULL; // //tag_t new_item_tag = NULLTAG; // printf("----------------------------------------------------\n"); // const char* temp = NULL; // //while ((temp = va_arg(va, const char*)) != NULL && strlen(temp) > 0) { // // printf("Number: %s\n", temp); // //} // // //printf("--------------------------------\n"); // const char* item_id = va_arg(va, const char*); // const char* item_name = va_arg(va, const char*); // const char* item_type = va_arg(va, const char*); // const char* rev_id = va_arg(va, const char*); // printf("item_id=========%s\n", item_id); // printf("item_name=========%s\n", item_name); // printf("item_type=========%s\n", item_type); // printf("rev_id=========%s\n", rev_id); // tag_t* new_item_tag = va_arg(va, tag_t*);//创建后的对象 // //获取首选项 // // int url_num = 0; // char** url_vals = NULL; // ITKCALL(PREF_ask_char_values("connor_CheckMaterialDesc", &url_num, &url_vals)); // char* pref = url_vals[0]; // printf("pref=========%s\n", pref); // // if (new_item_tag) // { // // ITKCALL(AOM_ask_value_string(*new_item_tag, "object_type", &type)); // printf("object_type=========%s\n", type); // if (strstr(pref,type)) { // tag_t rev = NULLTAG; // ITKCALL(ITEM_ask_latest_rev(*new_item_tag, &rev)); // if (rev != NULLTAG) { // printf("1111111111111111111111111111\n"); // ITKCALL(AOM_ask_value_string(rev, "ly6_materialDesc", &desc)); // printf("desc=========%s\n", desc); // // 计算字符串长度 // size_t length = strlen(desc); // // // 判断字符串长度是否超过40个字符 // if (length > 40) { // EMH_store_error_s2(EMH_severity_error, // 919012, // "提示", // "物料描述不能超过40个字符,请检查后重新输入!"); // return -1; // } // } // // // } // // // // // } // return 0; //}