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.

1485 lines
38 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.

#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<string> 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<tag_t> 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<tag_t>().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<std::chrono::microseconds>(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<char *> 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<char *> 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;
}