#define _CRT_SECURE_NO_WARNINGS #include "epm_handler_common.h" #define ITK_err 919012 bool FindNode(TiXmlElement *pRoot, char * nodeName, int &index, TiXmlElement **&pNode); bool isOK(tag_t item, char * where); bool whereIsOK(tag_t item, char * where); int ML_SetProcessNodeOwner(EPM_action_message_t msg) { printf("=========================设置节点负责人 Start===================\n"); auto startTime = std::chrono::high_resolution_clock::now(); int ifail = ITK_ok; int attachments_num = 0; tag_t rootTask = NULLTAG, *attachments = NULLTAG; //获取任务对象 EPM_ask_root_task(msg.task, &rootTask); //获取任务目标对象 EPM_ask_attachments(rootTask, EPM_target_attachment, &attachments_num, &attachments); int sub_task_count = 0; tag_t * sub_tasks = NULLTAG; //得到根流程下的所有的一级节点 EPM_ask_sub_tasks(rootTask, &sub_task_count, &sub_tasks); //获取参数 char *argflag = NULL, *argvalue = NULL, *arg = NULL; string type; vector types; char objectType[1024] = "", fileUid[1024] = ""; int arg_cnt = TC_number_of_arguments(msg.arguments); //printf("参数个数为:%d\n", arg_cnt); if (arg_cnt > 0) { for (int i = 0; i < arg_cnt; i++) { //获取下一个参数(从0开始) arg = TC_next_argument(msg.arguments); //获取参数的名称和值 ifail = ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue); if (stricmp(argflag, "objectType") == 0) { if (argvalue != NULL) { //strcpy(objectType, argvalue); type.assign(argvalue); } } else if (stricmp(argflag, "fileUid") == 0) { if (argvalue != NULL) { strcpy(fileUid, argvalue); } } } } //解析handler参数 { int strnum = 0; types = split2(type, ","); if (types.size() == 0) { EMH_store_error_s1(EMH_severity_error, ITK_err, "未配置流程参数:-type"); ifail = 1; goto end; } } tag_t dataSet = NULLTAG; //根据Uid获取数据集 ITK__convert_uid_to_tag(fileUid, &dataSet); AE_reference_type_t ae_ref; tag_t ref_obj = NULLTAG; AE_ask_dataset_named_ref2(dataSet, "XMLRendering", &ae_ref, &ref_obj); char out_path[SS_MAXPATHLEN] = ""; strcpy(out_path, getenv("temp")); strcat(out_path, "\\"); strcat(out_path, "流程审核人.xml"); IMF_export_file(ref_obj, out_path); char * processName = NULL; EPM_ask_name2(rootTask, &processName); //cout << "流程名称" << processName << endl; TiXmlDocument* m_pDocument = new TiXmlDocument(); if (!m_pDocument->LoadFile(out_path)) { cout << "无法加载xml文件!" << endl; } //删除文件 remove(out_path); if (NULL == m_pDocument) { printf("未找到文件===================\n"); } //printf("找到文件===================\n"); TiXmlElement *pRoot = m_pDocument->RootElement(); if (NULL == pRoot) { printf("未找到根节点===================\n"); } //printf("找到根节点===================\n"); POM_AM__set_application_bypass(TRUE); //for (int ii = 0; ii < attachments_num; ii++) for (int ii = 0; ii < 1; ii++) { char *itemType = NULL; AOM_ask_value_string(attachments[ii], "object_type", &itemType); //printf("type_class : %s \r\n", itemType); //printf("type_class : %s,-objectType:%s \r\n", itemType, type.c_str()); //if (strcmp(itemType, objectType) != 0) if (!isVecHasStr(types, itemType)) { continue; } //printf("方法执行\n"); int pTypeNodeCount = 0; TiXmlElement ** pTypeNode = (TiXmlElement **)MEM_alloc(1024 * sizeof(TiXmlElement *)); FindNode(pRoot, itemType, pTypeNodeCount, pTypeNode); for (int jj = 0; jj < pTypeNodeCount; jj++) { int pNodeCount = 0; TiXmlElement ** pNode = (TiXmlElement **)MEM_alloc(1024 * sizeof(TiXmlElement *)); FindNode(pTypeNode[jj], processName, pNodeCount, pNode); for (int i = 0; i < sub_task_count; i++) { char * cur_task_name = NULL; //获取节点名称 EPM_ask_name2(sub_tasks[i], &cur_task_name); //cout << "流程节点名称" << cur_task_name << endl; for (int j = 0; j < pNodeCount; j++) { //获取流程节点 int pChildProcessNodeCount = 0; TiXmlElement ** pChildProcessNode = (TiXmlElement **)MEM_alloc(1024 * sizeof(TiXmlElement *)); FindNode(pNode[j], cur_task_name, pChildProcessNodeCount, pChildProcessNode); for (int k = 0; k < pChildProcessNodeCount; k++) { TiXmlElement *pChild = pChildProcessNode[k]; //int i = 0; for (pChild = pChild->FirstChildElement(); pChild != NULL; pChild = pChild->NextSiblingElement()) { //TiXmlElement *p = pChild; //判断是否满足条件 TiXmlAttribute *pAttr = NULL; char * referenced = NULL; char * where = NULL; for (pAttr = pChild->FirstAttribute(); pAttr != NULL; pAttr = pAttr->Next()) { string propertyName = pAttr->Name(); string propertyValue = pAttr->Value(); //cout << "属性名称" << propertyName << endl; //cout << "属性值" << U2G(propertyValue.c_str()) << endl; if (strcmp(propertyName.c_str(), "referenced") == 0) { referenced = U2G(propertyValue.c_str()); } else if (strcmp(propertyName.c_str(), "where") == 0) { where = U2G(propertyValue.c_str()); } } tag_t item = attachments[ii]; char * propertyValue = NULL; if (referenced != NULL && strcmp(referenced, "") != 0) { //获取关系属性的值 AOM_ask_value_tag(item, referenced, &item); } //判断是否满足条件 if (isOK(item, where)) { //获取下挂的用户 TiXmlElement *pUserChild = pChild; //int i = 0; for (pUserChild = pUserChild->FirstChildElement(); pUserChild != NULL; pUserChild = pUserChild->NextSiblingElement()) { TiXmlAttribute *pUserAttr = NULL; char * referenced = ""; char * referenced2 = ""; char * name = ""; char * group = ""; char * role = ""; char * userID = ""; for (pUserAttr = pUserChild->FirstAttribute(); pUserAttr != NULL; pUserAttr = pUserAttr->Next()) { string propertyName = pUserAttr->Name(); string propertyValue = pUserAttr->Value(); //cout << "属性名称" << propertyName << endl; //cout << "属性值" << U2G(propertyValue.c_str()) << endl; if (strcmp(propertyName.c_str(), "referenced") == 0) { referenced = strdup(propertyValue.c_str()); } else if (strcmp(propertyName.c_str(), "referenced2") == 0) { referenced2 = strdup(propertyValue.c_str()); } else if (strcmp(propertyName.c_str(), "propertyName") == 0) { name = strdup(propertyValue.c_str()); } else if (strcmp(propertyName.c_str(), "group") == 0) { group = U2G(propertyValue.c_str()); } else if (strcmp(propertyName.c_str(), "role") == 0) { role = U2G(propertyValue.c_str()); } else if (strcmp(propertyName.c_str(), "userID") == 0) { userID = strdup(propertyValue.c_str()); } } AOM_refresh(attachments[ii], TRUE); tag_t userItem = attachments[ii]; vector userVector; if (strcmp(name, "") != 0) { //判断是否需要通过关系查找 if (strcmp(referenced, "") != 0) { int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(userItem, referenced, &relationNum, &relationTags); if (relationNum == 0) { cout << "根据关系未获取到对象" << referenced << endl; } else { userItem = relationTags[0]; } //获取关系属性的值 //AOM_ask_value_tag(item, referenced, &userItem); } AOM_refresh(userItem, TRUE); if (strcmp(referenced2, "") != 0) { int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(userItem, referenced2, &relationNum, &relationTags); if (relationNum == 0) { cout << "根据关系未获取到对象" << referenced2 << endl; } else { userItem = relationTags[0]; } //获取关系属性的值 //AOM_ask_value_tag(userItem, referenced2, &userItem); } //获取用户 char * userId = NULL; tag_t user = NULLTAG; AOM_ask_value_string(userItem, name, &userId); if (strstr(userId, "(") != NULL) { //按照AND进行拆分。拆分条件 int valueCount = 0; char ** valueChar = new char *[64]; //分割字符串 split(userId, "(", valueChar, &valueCount); if (valueCount > 1) { removeChar(valueChar[1], ')'); userId = valueChar[1]; } } SA_find_user2(userId, &user); userVector.push_back(user); DOFREE(userId); } if (strcmp(userID, "") != 0) { tag_t user = NULLTAG; SA_find_user2(userID, &user); userVector.push_back(user); } else if (strcmp(role, "") != 0) { if (strcmp(group, "") != 0) { tag_t groupTag = NULLTAG; int roleCount = 0; tag_t * roleTags = NULLTAG; SA_find_group(group, &groupTag); SA_ask_roles_from_group(groupTag, &roleCount, &roleTags); for (int ii = 0; ii < roleCount; ii++) { char * roleName = NULL; //获取角色名称 SA_ask_role_name2(roleTags[ii], &roleName); if (strcmp(role, roleName) == 0) { int num_of_members = 0; tag_t * member_tags = NULLTAG; SA_find_groupmember_by_role(roleTags[ii], groupTag, &num_of_members, &member_tags); for (int jj = 0; jj < num_of_members; jj++) { tag_t processNodeUser = NULLTAG; SA_ask_groupmember_user(member_tags[jj], &processNodeUser); userVector.push_back(processNodeUser); } DOFREE(member_tags); } DOFREE(roleName); } DOFREE(roleTags); } else { /*tag_t roleTag = NULLTAG; SA_find_role2(role, &roleTag); userVector.push_back(roleTag);*/ } } else if (strcmp(group, "") != 0) { tag_t groupTag = NULLTAG; SA_find_group(group, &groupTag); int num_of_members = 0; tag_t * member_tags = NULLTAG; SA_find_groupmembers_by_group(groupTag, &num_of_members, &member_tags); for (int ii = 0; ii < num_of_members; ii++) { tag_t processNodeUser = NULLTAG; SA_ask_groupmember_user(member_tags[ii], &processNodeUser); userVector.push_back(processNodeUser); } DOFREE(member_tags); } create_adhoc_signoff(sub_tasks[i], userVector); pUserAttr = NULL; userVector.clear(); vector().swap(userVector); DOFREE(referenced); DOFREE(referenced2); DOFREE(name); DOFREE(group); DOFREE(role); DOFREE(userID); } pUserChild = NULL; } pAttr = NULL; DOFREE(referenced); DOFREE(where); DOFREE(propertyValue); } pChild = NULL; } pChildProcessNode = NULL; } DOFREE(cur_task_name); } pNode = NULL; } pTypeNode = NULL; DOFREE(itemType); } POM_AM__set_application_bypass(FALSE); m_pDocument = NULL; pRoot = NULL; DOFREE(attachments); DOFREE(sub_tasks); DOFREE(argflag); DOFREE(argvalue); DOFREE(arg); DOFREE(processName); end: auto stopTime = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(stopTime - startTime); //std::cout << "ML_SetProcessNodeOwner用时:" << duration.count() / 1000 << std::endl; string usetime = "ML_SetProcessNodeOwner用时:"; usetime.append(std::to_string(duration.count() / 1000)); WriteLog(true, usetime.c_str()); printf("=========================设置节点负责人 End===================\n"); return 0; } bool isOK(tag_t item, char * where) { bool result = true; if (strstr(where, "AND") != NULL) { //按照AND进行拆分。拆分条件 int valueCount = 0; char ** valueChar = new char *[5000]; //分割字符串 split(where, "AND", valueChar, &valueCount); for (int i = 0; i < valueCount; i++) { //如果拆分出来包含OR的(列:(A OR B)) if (strstr(valueChar[i], "(") != NULL && strstr(valueChar[i], ")") != NULL && strstr(valueChar[i], "OR") != NULL) { removeChar(valueChar[i], '('); removeChar(valueChar[i], ')'); removeChar(valueChar[i], ' '); //根据OR进行拆分 int orValueCount = 0; char ** orValueChar = new char *[5000]; //分割字符串 split(valueChar[i], "OR", orValueChar, &orValueCount); bool isOK = false; for (int j = 0; j < orValueCount; j++) { //判断是否满足条件 if (whereIsOK(item, orValueChar[j])) { isOK = true; break; } } delete[]orValueChar; orValueChar = NULL; if (!isOK) { result = false; break; } } //如果拆分出的AND包含括号的(列:(A AND B) 拆分后就是:(A ) else if (strstr(valueChar[i], "(") != NULL) { //去除左括号 removeChar(valueChar[i], '('); removeChar(valueChar[i], ' '); //判断是否满足条件 if (!whereIsOK(item, valueChar[i])) { result = false; break; } } //如果拆分出的AND包含括号的(列:(A AND B) 拆分后就是:B) ) else if (strstr(valueChar[i], ")") != NULL) { //去除右括号 removeChar(valueChar[i], ')'); removeChar(valueChar[i], ' '); //判断是否满足条件 if (!whereIsOK(item, valueChar[i])) { result = false; break; } } //如果拆分出的AND包含OR但不包含括号的(列:A AND B OR C 拆分后就是:A、B OR C ) else if (strstr(valueChar[i], "OR") != NULL) { removeChar(valueChar[i], ' '); //根据OR进行拆分 int orValueCount = 0; char ** orValueChar = new char *[5000]; //分割字符串 split(valueChar[i], "OR", orValueChar, &orValueCount); bool isOk = false; for (int j = 1; j < orValueCount; j++) { if (whereIsOK(item, orValueChar[j])) { isOk = true; break; } } delete[]orValueChar; orValueChar = NULL; if (!whereIsOK(item, orValueChar[0]) && !isOk) { isOk = false; break; } } else { removeChar(valueChar[i], ' '); //判断是否满足条件 if (!whereIsOK(item, valueChar[i])) { result = false; break; } } } delete[]valueChar; valueChar = NULL; } else { removeChar(where, ' '); result = whereIsOK(item, where); } return result; } //判断条件(例:item.owning_user.user_id=1111)是否满足 bool whereIsOK(tag_t item, char * where) { //cout << "条件" << where << endl; bool result = false; if (strstr(where, "!=") != NULL) { //根据等号拆分条件和值 int valueCount = 0; char ** valueChar = new char *[1000]; //分割字符串 split(where, "!=", valueChar, &valueCount); char * itemWhere = valueChar[0]; char * value = valueChar[1]; //判断是否包含.号 if (strstr(itemWhere, ".") != NULL) { char *itemType = NULL; AOM_ask_value_string(item, "object_type", &itemType); //根据等号拆分条件和值 int itemPropertyCount = 0; char ** itemPropertyChar = new char *[64]; //分割字符串 split(itemWhere, ".", itemPropertyChar, &itemPropertyCount); char * itemAddress = itemPropertyChar[0]; //判断传进来的是版本还是对象 if (strstr(itemType, "Revision") != NULL) { //传进来的是版本 if (strcmp(itemAddress, "item") == 0) { ITEM_ask_item_of_rev(item, &item); } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(item, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } else if (strstr(itemType, "Schedule") != NULL) { } else { tag_t revisions = NULLTAG; ITEM_ask_latest_rev(item, &revisions); //传进来的是对象 if (strcmp(itemAddress, "rev") == 0) { item = revisions; } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { //AOM_ask_value_tag(item, itemPropertyChar[i], &item); int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(item, itemPropertyChar[i], &relationNum, &relationTags); if (relationNum == 0) { //cout << "根据关系未获取到对象" << itemPropertyChar[i] << endl; } else { item = relationTags[0]; } } //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (strcmp("空", value) == 0) { if (getValue != NULL && strcmp("", getValue) != 0) { result = true; } } else { if (strcmp(getValue, value) != 0) { result = true; } } DOFREE(getValue); } else if (itemPropertyCount == 2) { //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (strcmp("空", value) == 0) { if (getValue != NULL && strcmp("", getValue) != 0) { result = true; } } else { if (strcmp(getValue, value) != 0) { result = true; } } DOFREE(getValue); } delete[]itemPropertyChar; itemPropertyChar = NULL; DOFREE(itemType); DOFREE(itemAddress); } delete[]valueChar; valueChar = NULL; DOFREE(itemWhere); DOFREE(value); } else if (strstr(where, "=") != NULL) { //根据等号拆分条件和值 int valueCount = 0; char ** valueChar = new char *[64]; //分割字符串 split(where, "=", valueChar, &valueCount); char * itemWhere = valueChar[0]; char * value = valueChar[1]; //cout << "比较值" << value << endl; //判断是否包含.号 if (strstr(itemWhere, ".") != NULL) { char *itemType = NULL; AOM_ask_value_string(item, "object_type", &itemType); //根据等号拆分条件和值 int itemPropertyCount = 0; char ** itemPropertyChar = new char *[64]; //分割字符串 split(itemWhere, ".", itemPropertyChar, &itemPropertyCount); char * itemAddress = itemPropertyChar[0]; //判断传进来的是版本还是对象 if (strstr(itemType, "Revision") != NULL) { //传进来的是版本 if (strcmp(itemAddress, "item") == 0) { ITEM_ask_item_of_rev(item, &item); } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(item, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } else if (strstr(itemType, "Schedule") != NULL) { } else { tag_t revisions = NULLTAG; ITEM_ask_latest_rev(item, &revisions); //传进来的是对象 if (strcmp(itemAddress, "rev") == 0) { item = revisions; } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { PROP_value_type_t propertyType; char * valtype_n = NULL; //获取属性类型 /*AOM_ask_value_type(item, itemPropertyChar[i], &propertyType, &valtype_n); if (propertyType == PROP_typed_relation) { int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(item, itemPropertyChar[i], &relationNum,&relationTags); if (relationNum == 0) { cout << "根据关系未获取到对象" << itemPropertyChar[i] << endl; } else { item = relationTags[0]; } } else { AOM_ask_value_tag(item, itemPropertyChar[i], &item); }*/ int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(item, itemPropertyChar[i], &relationNum, &relationTags); if (relationNum == 0) { //cout << "根据关系未获取到对象" << itemPropertyChar[i] << endl; } else { item = relationTags[0]; } if (item == NULLTAG) { //cout << "根据关系未获取到对象" << itemPropertyChar[i] << endl; } } //获取属性值 char * getValue = NULL; //cout << "获取属性值" << itemPropertyChar[itemPropertyCount - 1] << endl; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); if (getValue == NULL) { cout << "获取值为NULL" << endl; } //cout << "值" << getValue << endl; //cout << "比较条件" << getValue << value << endl; if (strcmp("空", value) == 0) { if (getValue == NULL || strcmp("", getValue) == 0) { result = true; } } else { if (strcmp(getValue, value) == 0) { result = true; } } DOFREE(getValue); } else if (itemPropertyCount == 2) { //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (strcmp("空", value) == 0) { if (getValue == NULL || strcmp("", getValue) == 0) { result = true; } } else { if (strcmp(getValue, value) == 0) { result = true; } } DOFREE(getValue); } delete[]itemPropertyChar; itemPropertyChar = NULL; DOFREE(itemType); DOFREE(itemAddress); } delete[]valueChar; valueChar = NULL; DOFREE(itemWhere); DOFREE(value); } else if (strstr(where, "NOT IN") != NULL) { //根据等号拆分条件和值 int valueCount = 0; char ** valueChar = new char *[64]; //分割字符串 split(where, "NOT IN", valueChar, &valueCount); char * itemWhere = valueChar[0]; char * value = valueChar[1]; vector vectorValues; if (strstr(value, ",") != NULL) { int vectorValueCount = 0; char ** vectorValueChar = new char *[64]; split(where, ",", vectorValueChar, &vectorValueCount); for (int i = 0; i < vectorValueCount; i++) { vectorValues.push_back(vectorValueChar[i]); } } else { vectorValues.push_back(value); } //判断是否包含.号 if (strstr(itemWhere, ".") != NULL) { char *itemType = NULL; AOM_ask_value_string(item, "object_type", &itemType); //根据等号拆分条件和值 int itemPropertyCount = 0; char ** itemPropertyChar = new char *[64]; //分割字符串 split(itemWhere, ".", itemPropertyChar, &itemPropertyCount); char * itemAddress = itemPropertyChar[0]; //判断传进来的是版本还是对象 if (strstr(itemType, "Revision") != NULL) { //传进来的是版本 if (strcmp(itemAddress, "item") == 0) { ITEM_ask_item_of_rev(item, &item); } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(item, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } else if (strstr(itemType, "Schedule") != NULL) { } else { tag_t revisions = NULLTAG; ITEM_ask_latest_rev(item, &revisions); //传进来的是对象 if (strcmp(itemAddress, "rev") == 0) { item = revisions; } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(item, itemPropertyChar[i], &relationNum, &relationTags); if (relationNum == 0) { //cout << "根据关系未获取到对象" << itemPropertyChar[i] << endl; } else { item = relationTags[0]; } //AOM_ask_value_tag(item, itemPropertyChar[i], &item); } //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (!count(vectorValues, getValue)) { result = true; } DOFREE(getValue); } else if (itemPropertyCount == 2) { //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (!count(vectorValues, getValue)) { result = true; } DOFREE(getValue); } delete[]itemPropertyChar; itemPropertyChar = NULL; DOFREE(itemType); DOFREE(itemAddress); } delete[]valueChar; valueChar = NULL; DOFREE(itemWhere); DOFREE(value); } else if (strstr(where, "IN") != NULL) { //根据等号拆分条件和值 int valueCount = 0; char ** valueChar = new char *[64]; //分割字符串 split(where, "IN", valueChar, &valueCount); char * itemWhere = valueChar[0]; char * value = valueChar[1]; vector vectorValues; if (strstr(value, ",") != NULL) { int vectorValueCount = 0; char ** vectorValueChar = new char *[64]; split(where, ",", vectorValueChar, &vectorValueCount); for (int i = 0; i < vectorValueCount; i++) { vectorValues.push_back(vectorValueChar[i]); } } else { vectorValues.push_back(value); } //判断是否包含.号 if (strstr(itemWhere, ".") != NULL) { char *itemType = NULL; AOM_ask_value_string(item, "object_type", &itemType); //根据等号拆分条件和值 int itemPropertyCount = 0; char ** itemPropertyChar = new char *[64]; //分割字符串 split(itemWhere, ".", itemPropertyChar, &itemPropertyCount); char * itemAddress = itemPropertyChar[0]; //判断传进来的是版本还是对象 if (strstr(itemType, "Revision") != NULL) { //传进来的是版本 if (strcmp(itemAddress, "item") == 0) { ITEM_ask_item_of_rev(item, &item); } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(item, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } else if (strstr(itemType, "Schedule") != NULL) { } else { tag_t revisions = NULLTAG; ITEM_ask_latest_rev(item, &revisions); //传进来的是对象 if (strcmp(itemAddress, "rev") == 0) { item = revisions; } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(item, itemPropertyChar[i], &relationNum, &relationTags); if (relationNum == 0) { //cout << "根据关系未获取到对象" << itemPropertyChar[i] << endl; } else { item = relationTags[0]; } //AOM_ask_value_tag(item, itemPropertyChar[i], &item); } //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (count(vectorValues, getValue)) { result = true; } DOFREE(getValue); } else if (itemPropertyCount == 2) { //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (count(vectorValues, getValue)) { result = true; } DOFREE(getValue); } delete[]itemPropertyChar; itemPropertyChar = NULL; DOFREE(itemType); DOFREE(itemAddress); } delete[]valueChar; valueChar = NULL; DOFREE(itemWhere); DOFREE(value); } else if (strstr(where, "NOT LIKE") != NULL) { //根据等号拆分条件和值 int valueCount = 0; char ** valueChar = new char *[64]; //分割字符串 split(where, "!=", valueChar, &valueCount); char * itemWhere = valueChar[0]; char * value = valueChar[1]; //判断是否包含.号 if (strstr(itemWhere, ".") != NULL) { char *itemType = NULL; AOM_ask_value_string(item, "object_type", &itemType); //根据等号拆分条件和值 int itemPropertyCount = 0; char ** itemPropertyChar = new char *[64]; //分割字符串 split(itemWhere, ".", itemPropertyChar, &itemPropertyCount); char * itemAddress = itemPropertyChar[0]; //判断传进来的是版本还是对象 if (strstr(itemType, "Revision") != NULL) { //传进来的是版本 if (strcmp(itemAddress, "item") == 0) { ITEM_ask_item_of_rev(item, &item); } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(item, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } else if (strstr(itemType, "Schedule") != NULL) { } else { tag_t revisions = NULLTAG; ITEM_ask_latest_rev(item, &revisions); //传进来的是对象 if (strcmp(itemAddress, "rev") == 0) { item = revisions; } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(item, itemPropertyChar[i], &relationNum, &relationTags); if (relationNum == 0) { //cout << "根据关系未获取到对象" << itemPropertyChar[i] << endl; } else { item = relationTags[0]; } //AOM_ask_value_tag(item, itemPropertyChar[i], &item); } //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (strstr(getValue, value) == NULL) { result = true; } DOFREE(getValue); } else if (itemPropertyCount == 2) { //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (strstr(getValue, value) == NULL) { result = true; } DOFREE(getValue); } delete[]itemPropertyChar; itemPropertyChar = NULL; DOFREE(itemType); DOFREE(itemAddress); } delete[]valueChar; valueChar = NULL; DOFREE(itemWhere); DOFREE(value); } else if (strstr(where, "LIKE") != NULL) { //根据等号拆分条件和值 int valueCount = 0; char ** valueChar = new char *[64]; //分割字符串 split(where, "LIKE", valueChar, &valueCount); char * itemWhere = valueChar[0]; char * value = valueChar[1]; //判断是否包含.号 if (strstr(itemWhere, ".") != NULL) { char *itemType = NULL; AOM_ask_value_string(item, "object_type", &itemType); //根据等号拆分条件和值 int itemPropertyCount = 0; char ** itemPropertyChar = new char *[64]; //分割字符串 split(itemWhere, ".", itemPropertyChar, &itemPropertyCount); char * itemAddress = itemPropertyChar[0]; //判断传进来的是版本还是对象 if (strstr(itemType, "Revision") != NULL) { //传进来的是版本 if (strcmp(itemAddress, "item") == 0) { ITEM_ask_item_of_rev(item, &item); } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(item, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } else if (strstr(itemType, "Schedule") != NULL) { } else { tag_t revisions = NULLTAG; ITEM_ask_latest_rev(item, &revisions); //传进来的是对象 if (strcmp(itemAddress, "rev") == 0) { item = revisions; } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { //printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { int relationNum = 0; tag_t * relationTags = NULLTAG; AOM_ask_value_tags(item, itemPropertyChar[i], &relationNum, &relationTags); if (relationNum == 0) { //cout << "根据关系未获取到对象" << itemPropertyChar[i] << endl; } else { item = relationTags[0]; } //AOM_ask_value_tag(item, itemPropertyChar[i], &item); } //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (strstr(getValue, value) != NULL) { result = true; } DOFREE(getValue); } else if (itemPropertyCount == 2) { //获取属性值 char * getValue = NULL; AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], &getValue); //cout << "比较条件" << getValue << value << endl; if (strstr(getValue, value) != NULL) { result = true; } DOFREE(getValue); } delete[]itemPropertyChar; itemPropertyChar = NULL; DOFREE(itemType); DOFREE(itemAddress); } delete[]valueChar; valueChar = NULL; DOFREE(itemWhere); DOFREE(value); } return result; } //根据节点属性值,获取节点的集合 bool FindNode(TiXmlElement *pRoot, char * nodeName, int &index, TiXmlElement **&pNode) { TiXmlElement *p = pRoot; //int i = 0; for (p = p->FirstChildElement(); p != NULL; p = p->NextSiblingElement()) { TiXmlAttribute *pAttr = NULL; for (pAttr = p->FirstAttribute(); pAttr != NULL; pAttr = pAttr->Next()) { char * value = NULL; value = U2G(pAttr->Value()); if (strcmp(value, nodeName) == 0) { pNode[index] = p; index++; } } } return false; }