#define _CRT_SECURE_NO_WARNINGS #include "epm_handler_common.h" int ML_ItemRevPreUpdate(METHOD_message_t* msg, va_list args) { printf("=========================版本修订前操作 Start===================\n"); int ifail = ITK_ok; tag_t new_rev = va_arg(args, tag_t);//修订的旧版本 char* operation = va_arg(args, char*);//rev_id tag_t parent_rev = va_arg(args, tag_t);//修订前版本 printf("operation:%s\n", operation); //如果是修订操作 if (strcmp(operation, "Revise") == 0) { int pref_cnt = 0; char ** pref_vals = NULL; //获取首选项的值 PREF_ask_char_values("ML_ItemRevPreUpdate", &pref_cnt, &pref_vals); map typePropertyType; for (int j = 0; j < pref_cnt; j++) { if (strstr(pref_vals[j], "-") != NULL) { //按照-进行拆分。拆分条件 int valueCount = 0; char ** valueChar = new char *[64]; //分割字符串 split(pref_vals[j], "-", valueChar, &valueCount); typePropertyType[valueChar[0]] = valueChar[1];// .insert(std::pair(valueChar[0], valueChar[1])); } } //获取对象类型 char * itemType = NULL; AOM_ask_value_string(parent_rev, "object_type", &itemType); printf("itemType : %s \r\n", itemType); //判断 tag_t item = NULLTAG; ITEM_ask_item_of_rev(parent_rev, &item); tag_t class_tag = NULL, attr_id = NULL; char * class_id = NULL; POM_class_of_instance(item, &class_tag); POM_name_of_class(class_tag, &class_id); int ifail2 = POM_attr_id_of_attr("ml8_Status", class_id, &attr_id); if (ifail2 == ITK_ok && attr_id != NULL) { //获取drawmark属性的值 char * generalIdentify = NULL; AOM_ask_value_string(item, "ml8_Status", &generalIdentify); printf("限用:%s====================\n", generalIdentify); //if (generalIdentify != NULL && (strcmp(generalIdentify, "限用") == 0 || strcmp(generalIdentify, "冻结") == 0)) //if (generalIdentify != NULL && (strcmp(generalIdentify, "限用") == 0 || strcmp(generalIdentify, "冻结") == 0 || strcmp(generalIdentify, "RestrictPart") == 0 || strcmp(generalIdentify, "FreezePart") == 0))//20230928添加BOM时限制添加冻结、限用物料处理步骤 if (generalIdentify != NULL && (strcmp(generalIdentify, "RestrictPart") == 0 || strcmp(generalIdentify, "FreezePart") == 0 || strcmp(generalIdentify, "ObsoletePart") == 0))//20250116海外要求增加废止状态 { printf("物料状态不匹配 \r\n"); ifail = 1; } DOFREE(generalIdentify); } if (ifail == 1) { } else { string propertyNames = typePropertyType[itemType]; if (propertyNames.c_str() != NULL) { const char * statusName = propertyNames.c_str(); char* name = new char[2048];//足够长 strcpy(name, statusName); printf("name : %s \r\n", name); char * revPuid = NULL; //获取PUID ITK__convert_tag_to_uid(parent_rev, &revPuid); if (strstr(name, "=") > 0) { //按照-进行拆分。拆分条件 int valueCount = 0; char ** valueChar = new char *[64]; //分割字符串 split(name, "=", valueChar, &valueCount); char * whereValue = valueChar[1]; bool isHaveItem = false; if (strstr(whereValue, ".") > 0) { int itemTypeCount = 0; char ** itemTypeChar = new char *[64]; //分割字符串 split(whereValue, ".", itemTypeChar, &itemTypeCount); char * stringItemType = itemTypeChar[0]; char * referencedName = itemTypeChar[1]; //判断是否在指定的关系下 int n_references = 0; int *levels = 0; tag_t * references_tag = NULLTAG; char ** relation_type_name = NULL; //通过引用关系查找到变更单 WSOM_where_referenced(parent_rev, 1, &n_references, &levels, &references_tag, &relation_type_name); for (int i = 0; i < n_references; i++) { char *objectType = NULL; AOM_ask_value_string(references_tag[i], "object_type", &objectType); printf("object_type : %s \r\n", objectType); printf("stringItemType : %s \r\n", stringItemType); if (strcmp(stringItemType, objectType) == 0) { int itemNum = 0; tag_t * items = NULL; printf("referencedName : %s \r\n", referencedName); //获取指定关系下的对象 AOM_ask_value_tags(references_tag[i], referencedName, &itemNum, &items); printf("itemNum : %d \r\n", itemNum); for (int ii = 0; ii < itemNum; ii++) { char * puid = NULL; //获取PUID ITK__convert_tag_to_uid(items[ii], &puid); printf("puid : %s \r\n", puid); if (strcmp(revPuid, puid) == 0) { isHaveItem = true; break; } } } } } if (!isHaveItem) { printf("不在变更单的指定关系下 \r\n"); ifail = 1; } else { //判断是否发布 int releaseCount = 0; tag_t * releaseTags = NULL; //判断子件是否发布 AOM_ask_value_tags(parent_rev, "release_status_list", &releaseCount, &releaseTags); bool isHave = false; for (int i = 0; i < releaseCount; i++) { char * releaseString = NULL; AOM_ask_value_string(releaseTags[i], "object_name", &releaseString); printf("releaseString : %s \r\n", releaseString); if (strcmp(releaseString, valueChar[0]) == 0) { isHave = true; DOFREE(releaseString); break; } DOFREE(releaseString); } if (!isHave) { ifail = 1; } DOFREE(releaseTags); } } } } DOFREE(class_id); DOFREE(itemType); //DOFREE(releaseTags); } //DOFREE(operation); if (ifail == 1) { printf("ifail:%d \r\n", ifail); EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, "发布状态、物料状态不匹配,或不在变更单的指定关系下!不能进行修订!"); } printf("=========================版本修订修订前操作 End===================\n"); return ifail; }