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.

378 lines
11 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"
static void replace_design_representation(tag_t partRevTag, tag_t oldDesignRevTag, tag_t newDesignRevTag)
{
int ifail = ITK_ok;
tag_t priDesRepTypeTag = NULLTAG;
ifail = GRM_find_relation_type("TC_Primary_Design_Representation",
&priDesRepTypeTag);
if (ifail != ITK_ok) {/* your error logic here */ }
//tag_t isRepByTypeTag = NULLTAG;
//ifail = ifail = GRM_find_relation_type("TC_Is_Represented_By",
// &isRepByTypeTag);
//if (ifail != ITK_ok) {/* your error logic here */ }
ifail = AOM_refresh(partRevTag, TRUE);
if (ifail != ITK_ok) {/* your error logic here */ }
ifail = AOM_refresh(oldDesignRevTag, TRUE);
if (ifail != ITK_ok) {/* your error logic here */ }
ifail = ifail = AOM_refresh(newDesignRevTag, TRUE);
if (ifail != ITK_ok) {/* your error logic here */ }
tag_t relationTag = NULLTAG;
ifail = GRM_find_relation(partRevTag, oldDesignRevTag, priDesRepTypeTag,
&relationTag);
if (ifail != ITK_ok) {/* your error logic here */ }
ifail = GRM_delete_relation(relationTag);
if (ifail != ITK_ok) {
printf("删除TC_Primary_Design_Representation关系失败 \r\n");
}
//relationTag = NULLTAG;
//ifail = GRM_find_relation(partRevTag, oldDesignRevTag, isRepByTypeTag,
// &relationTag);
//if (ifail != ITK_ok) {/* your error logic here */ }
//ifail = GRM_delete_relation(relationTag);
if (ifail != ITK_ok) {/* your error logic here */ }
printf("添加TC_Primary_Design_Representation关系 \r\n");
relationTag = NULLTAG;
ifail = GRM_create_relation(partRevTag, newDesignRevTag, priDesRepTypeTag,
NULLTAG, &relationTag);
ifail = GRM_save_relation(relationTag);
if (ifail != ITK_ok) {
printf("添加TC_Primary_Design_Representation关系失败 \r\n");
}
//printf("添加TC_Is_Represented_By关系 \r\n");
//relationTag = NULLTAG;
//ifail = GRM_create_relation(partRevTag, newDesignRevTag, isRepByTypeTag,
// NULLTAG, &relationTag);
//ifail = GRM_save_relation(relationTag);
ifail = ifail = AOM_save(partRevTag);
if (ifail != ITK_ok) {/* your error logic here */ }
ifail = AOM_save(oldDesignRevTag);
if (ifail != ITK_ok) {/* your error logic here */ }
ifail = ifail = AOM_save(newDesignRevTag);
if (ifail != ITK_ok) {/* your error logic here */ }
ifail = ifail = AOM_refresh(partRevTag, FALSE);
if (ifail != ITK_ok) {/* your error logic here */ }
ifail = AOM_refresh(oldDesignRevTag, FALSE);
if (ifail != ITK_ok) {/* your error logic here */ }
ifail = ifail = AOM_refresh(newDesignRevTag, FALSE);
if (ifail != ITK_ok) {/* your error logic here */ }
}
int ML_ItemRevUpdate(METHOD_message_t* msg, va_list args)
{
printf("=========================版本修订 Start===================\n");
int ifail = ITK_ok;
tag_t old_rev = va_arg(args, tag_t);//要修订的旧版本
char* operation = va_arg(args, char*);//rev_id
tag_t* new_rev = va_arg(args, tag_t*);//修订后的新版本
printf("operation%s\n", operation);
int n_references = 0;
int *levels = 0;
tag_t * references_tag = NULLTAG;
char ** relation_type_name = NULL;
//通过引用关系查找到变更单
WSOM_where_referenced(old_rev, 1, &n_references, &levels, &references_tag, &relation_type_name);
for (int i = 0; i < n_references; i++)
{
char *itemType = NULL;
tag_t spec_relation = NULLTAG, relation = NULLTAG;
AOM_ask_value_string(references_tag[i], "object_type", &itemType);
printf("type_class : %s \r\n", itemType);
if (strcmp(itemType, "ML8_CNoticeRevision") == 0 || strcmp(itemType, "ML8_CDocumentRevision") == 0 || strcmp(itemType, "ML8_MCNoticeRevision") == 0)
{
//添加到更改前属性中
//先lock
AOM_lock(references_tag[i]);
//获取关系类型
GRM_find_relation_type("ML8_GXBGH", &spec_relation);
//创建关系,在没有做关联的时候
GRM_create_relation(references_tag[i], new_rev[0], spec_relation, NULLTAG, &relation);
GRM_save_relation(relation);
//再save
AOM_save(references_tag[i]);
//最后unlock
AOM_unlock(references_tag[i]);
AOM_refresh(references_tag[i], FALSE);
}
//if (strcmp(itemType, "ML8_MCNoticeRevision") == 0)
//{
// //添加到更改前属性中
// //先lock
// AOM_lock(references_tag[i]);
// //获取关系类型
// GRM_find_relation_type("ML8_MCBGH", &spec_relation);
// //创建关系,在没有做关联的时候
// GRM_create_relation(references_tag[i], new_rev[0], spec_relation, NULLTAG, &relation);
// GRM_save_relation(relation);
// //再save
// AOM_save(references_tag[i]);
// //最后unlock
// AOM_unlock(references_tag[i]);
// AOM_refresh(references_tag[i], FALSE);
//}
DOFREE(itemType);
}
char * objectType = NULL;
AOM_ask_value_string(old_rev, "object_type", &objectType);
printf("objectType : %s \r\n", objectType);
POM_AM__set_application_bypass(TRUE);
if (strcmp(objectType, "ML8_DesignRevision") == 0)
{
//获取representation_for下的对象
int num = 0;
tag_t * tags = NULLTAG;
DESIGN_rev_ask_associated_part_revs(old_rev, &num, &tags);
printf("part数量 : %d \r\n", num);
for (int i = 0; i < num; i++)
{
AOM_lock(tags[i]);
AOM_lock(new_rev[0]);
tag_t rel = NULLTAG;
PART_rev_associate_design_rev(tags[i], new_rev[0], &rel);
AOM_unlock(tags[i]);
AOM_unlock(new_rev[0]);
AOM_save(tags[i]);
AOM_save(new_rev[0]);
AOM_refresh(tags[i], false);
AOM_refresh(new_rev[0], false);
//替换TC_Primary_Design_Representation
//replace_design_representation(tags[i], old_rev, new_rev[0]);
printf("添加PART成功!");
}
DOFREE(tags);
}
else if (strcmp(objectType, "ML8_RefrigeratorRevision") == 0 || strcmp(objectType, "ML8_WashingRevision") == 0 || strcmp(objectType, "ML8_ColdRevision") == 0
|| strcmp(objectType, "ML8_OthersRevision") == 0 || strcmp(objectType, "ML8_PartRevision") == 0)
{
//获取representation_for下的对象
int num = 0;
tag_t * tags = NULLTAG;
AOM_ask_value_tags(old_rev, "TC_Is_Represented_By", &num, &tags);
for (int i = 0; i < num; i++)
{
AOM_lock(tags[i]);
AOM_lock(new_rev[0]);
tag_t rel = NULLTAG;
PART_rev_associate_design_rev(new_rev[0], tags[i], &rel);
AOM_unlock(tags[i]);
AOM_unlock(new_rev[0]);
AOM_save(tags[i]);
AOM_save(new_rev[0]);
AOM_refresh(tags[i], false);
AOM_refresh(new_rev[0], false);
/*
int designNum = 0;
tag_t * designTags = NULLTAG;
DESIGN_rev_ask_associated_part_revs(tags[i], &designNum, &designTags);
designTags[designNum + 1] = new_rev[0];
AOM_lock(tags[i]);
AOM_set_value_tags(tags[i], "representation_for", designNum + 1, designTags);
AOM_unlock(tags[i]);
AOM_save(tags[i]);
AOM_refresh(tags[i], false);
DOFREE(designTags);*/
}
DOFREE(tags);
}
POM_AM__set_application_bypass(FALSE);
DOFREE(operation);
DOFREE(new_rev);
DOFREE(references_tag);
DOFREE(levels);
printf("=========================版本修订 End===================\n");
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;
}
/*
* @brief 根据选中文件夹所在项目为创建的对象、文件夹自动指派项目
* @param msg
* @param args
* @return
*/
int ML_Automatic_Assignment_Item(METHOD_message_t* msg, va_list va) {
printf("=========================自动指派项目 Start===================\n");
printf("成功触发[自动指派项目]方法!\n");
int ifail = ITK_ok;
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*);
//tag_t create_tag = va_arg(va, tag_t);
tag_t* create_tag = va_arg(va, tag_t*);//创建后的对象
tag_t projects[1] = { *create_tag };
tag_t folder_tag = NULLTAG;
//char* type = NULL;
int url_num = 0;
char** url_vals = NULL;
int* getrenums, referNum;
tag_t* renum;
char** retags;
int count = 0;
tag_t* tags;
//获取创建对象的类型
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);
//获取首选项中的数据,判断新建对象是否其中之一
ITKCALL(ifail = PREF_ask_char_values("ML_AutoAssignProject_ObjectType", &url_num, &url_vals));
if (url_num > 0) {
printf("获取首选项-ML_AutoAssignProject_ObjectType成功其中包含的对象类型有\n");
for (int i = 0; i < url_num; i++) {
printf("==> %s\n", url_vals[i]);
}
if (item_type != NULL) {
printf("当前创建的对象类型item_type=%s\n", item_type);
for (int i = 0; i < url_num; i++) {
if (strcmp(item_type, url_vals[i]) == 0) {//如果新建对象类型与首选项中的类型一致,则自动指派项目
printf("当前创建的对象类型item_type=%s与首选项中的类型一致开始自动指派项目···\n", item_type);
//引用者总数,层级数组,引用者数组,引用关系数组
ITKCALL(ifail = WSOM_where_referenced2(*create_tag, 1, &referNum, &getrenums, &renum, &retags));
if (referNum > 0) {
printf("成功获取到新建对象的关联对象for获取新建对象的所在文件夹数量referNum=%d\n", referNum);
for(int j = 0; j < referNum; j++){
char* refType = NULL;
ITKCALL(ifail = AOM_ask_value_string(renum[j], "object_type", &refType));
printf("获得的当前引用者类型:==>%s\n", refType);
//获取新建对象的文件夹对象
if (isTypeOf1(renum[j], "Folder")) {
printf("success->获取到文件夹对象\n");
folder_tag = renum[j];
//获取文件夹所在项目
ITKCALL(ifail = AOM_ask_value_tags(folder_tag, "project_list", &count, &tags));
printf("文件夹所在项目数量:%d开始指派项目···\n", count);
if (count > 0) {
//for (int k = 0; k < count; k++) {
// //给新建对象指派项目
// tag_t project_tag = tags[k];
// printf("成功获取到文件夹所在项目\n");
// //PROJ_assign_objects
//
//}
ITKCALL(ifail = PROJ_assign_objects(count, tags, 1, projects));
if (ifail == ITK_ok) {
printf("成功指派项目!\n");
}
else
{
printf("指派项目失败!\n");
}
}
else
{
printf("所在文件夹未指派到任何项目!\n");
}
MEM_free(tags);
break;
}
}
}
else
{
printf("未获取到创建对象的文件夹!\n");
}
MEM_free(retags);
MEM_free(renum);
MEM_free(getrenums);
break;
}
}
}
else
{
printf("未获取到创建对象的类型!\n");
}
}else {
printf("首选项中未获取到对象类型!\n");
}
MEM_free(url_vals);
//MEM_free(type);
return ifail;
}