|
|
#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;
|
|
|
} |