diff --git a/General/.vs/General/FileContentIndex/cfe63ec3-57d5-482a-a4a3-d2cf28d0129d.vsidx b/General/.vs/General/FileContentIndex/cfe63ec3-57d5-482a-a4a3-d2cf28d0129d.vsidx new file mode 100644 index 0000000..30836e4 Binary files /dev/null and b/General/.vs/General/FileContentIndex/cfe63ec3-57d5-482a-a4a3-d2cf28d0129d.vsidx differ diff --git a/General/.vs/General/v17/Browse.VC.db b/General/.vs/General/v17/Browse.VC.db new file mode 100644 index 0000000..02b540b Binary files /dev/null and b/General/.vs/General/v17/Browse.VC.db differ diff --git a/General/.vs/General/v17/fileList.bin b/General/.vs/General/v17/fileList.bin new file mode 100644 index 0000000..0f20c69 Binary files /dev/null and b/General/.vs/General/v17/fileList.bin differ diff --git a/General/General/CHINT_Ecn_SendOA.cxx b/General/General/CHINT_Ecn_SendOA.cxx index b737efd..3ce9238 100644 --- a/General/General/CHINT_Ecn_SendOA.cxx +++ b/General/General/CHINT_Ecn_SendOA.cxx @@ -192,56 +192,87 @@ int CHINT_ECN_SendOA(EPM_action_message_t msg) { ECHO("CHINT_ECN_SendOA 开始执行\n"); ECHO("=========================================================\n"); tag_t root_task = NULLTAG, *sub_tasks = NULL, current_task = NULLTAG, type_tag = NULLTAG; - int sub_task_count = 0, occur_of_counts = 0; + int sub_task_count = 0, occur_of_counts = 0, url_num; tag_t* taskAttches = NULLTAG; tag_t cur_task = NULLTAG; - char* jobName; + char* jobName = NULL, **url_vals = NULL; current_task = msg.task; - AOM_ask_value_string(current_task, "job_name", &jobName); - EPM_ask_root_task(msg.task, &root_task); - EPM_ask_sub_tasks(root_task, &sub_task_count, &sub_tasks); - EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &taskAttches); + ITKCALL(AOM_ask_value_string(current_task, "job_name", &jobName)); + ITKCALL(EPM_ask_root_task(msg.task, &root_task)); + ITKCALL(EPM_ask_sub_tasks(root_task, &sub_task_count, &sub_tasks)); + ITKCALL(EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &taskAttches)); + + ITKCALL(PREF_ask_char_values("database_tc", &url_num, &url_vals)); + string base_url = url_vals[0]; + base_url.append("/").append(url_vals[2]); + printf("url ==>%s\n", base_url.c_str()); + if (ConnServer(url_vals[3], url_vals[4], (char*)base_url.c_str()) == -1) { + printf("中间数据表访问失败\n"); + ifail = 919050; + ITKCALL(EMH_store_error_s1(EMH_severity_error, ifail, "database_tc")); + return ifail; + } //获取url地址 char* url, *userId, *urlId;// - PREF_ask_char_value("CHINT_ECNSendOAUrl", 0, &url); - PREF_ask_char_value("CHINT_OAUserID_RUL", 0, &urlId); + ITKCALL(PREF_ask_char_value("CHINT_ECNSendOAUrl", 0, &url)); + ITKCALL(PREF_ask_char_value("CHINT_OAUserID_RUL", 0, &urlId)); char* log_file = NULL; CreateLogFile("CHINT_ECN_SendOA", &log_file); // //获取当前流程目标 connectSql(); - POM_get_user_id(&userId); + ITKCALL(POM_get_user_id(&userId)); string email = userId; email.append("@chint.com"); string userXML = getUserIdOA(email, urlId); //获取登陆组 tag_t group; char *groupName, *taskUid; - POM_ask_group(&groupName, &group); - AOM_ask_value_string(group, PROP_GROUP_NAME, &groupName); + ITKCALL(POM_ask_group(&groupName, &group)); + ITKCALL(AOM_ask_value_string(group, PROP_GROUP_NAME, &groupName)); string userCode = readXmlId(userXML); ITK__convert_tag_to_uid(msg.task, &taskUid); //流程uid for (int count = 0; count < occur_of_counts; count++) { char *type; tag_t taskTag = taskAttches[count]; - AOM_ask_value_string(taskTag, "object_type", &type); + ITKCALL(AOM_ask_value_string(taskTag, "object_type", &type)); if (strcmp(type, "ZT2_Change") == 0) { + //如果当前流程目标下的变更单,对应的影响分析如果仅包含技术工艺,无其他部门,则不需要触发此handler + char *itemId = NULL; + ITKCALL(AOM_ask_value_string(taskTag, "item_id", &itemId)); + printf("id ===>%s\n", itemId); + string sql = "select \"principal\",\"section\" FROM CHINT_ECN_NOTIFICATION where \"result\"='是' and \"ecncode\"='"; + sql.append(itemId).append("'"); + int outputColumn1 = 0, outputValueCount1 = 0; + char*** outputValue1 = NULL; + printf("sql ===>%s\n", sql.c_str()); + QuerySQLNoInputParam((char*)sql.c_str(), &outputColumn1, &outputValueCount1, &outputValue1); + printf("outputValueCount1 ===>%d\n", outputValueCount1); + boolean pro = true; + for (int i = 0; i < outputValueCount1; i++) { + if (tc_strcmp(outputValue1[i][1], "技术部") != 0 && tc_strcmp(outputValue1[i][1], "工艺部") != 0) { + pro = false; + break; + } + } + if (pro) { + continue; + } //获取属性 查询数据库填写JSON int unitCnt, processCnt = 0; char* changeType, *productModel, *productName, *fileName, *contractNo, *contractName, - *changeDateStr, **changeUnits, *itemId, *changeRequestNo, **processTypes; - AOM_ask_value_string(taskTag, "item_id", &itemId); + *changeDateStr, **changeUnits, *changeRequestNo, **processTypes; date_t changeDate; - AOM_ask_value_string(taskTag, "zt2_ChangeType", &changeType);//变更类型 - AOM_ask_value_string(taskTag, "zt2_ProductModel", &productModel);//产品型号 - AOM_ask_value_string(taskTag, "zt2_ProductName", &productName); // 产品名称 - AOM_ask_value_string(taskTag, "zt2_FileName", &fileName); // 文件代号及名称 - AOM_ask_value_string(taskTag, "zt2_ContractNo", &contractNo); // 合同代号 - AOM_ask_value_string(taskTag, "zt2_ContractName", &contractName); // 合同名称 - AOM_ask_value_date(taskTag, "zt2_ChangeDate", &changeDate); // 变更实施日期 - AOM_ask_value_strings(taskTag, "zt2_ChangeUnit1",&unitCnt, &changeUnits); // 合同名称 - AOM_ask_value_string(taskTag, "zt2_ChangRequestNo", &changeRequestNo); // 更改通知单号 - AOM_ask_value_strings(taskTag, PROP_PROCESS, &processCnt, &processTypes); + ITKCALL(AOM_ask_value_string(taskTag, "zt2_ChangeType", &changeType));//变更类型 + ITKCALL(AOM_ask_value_string(taskTag, "zt2_ProductModel", &productModel));//产品型号 + ITKCALL(AOM_ask_value_string(taskTag, "zt2_ProductName", &productName)); // 产品名称 + ITKCALL(AOM_ask_value_string(taskTag, "zt2_FileName", &fileName)); // 文件代号及名称 + ITKCALL(AOM_ask_value_string(taskTag, "zt2_ContractNo", &contractNo)); // 合同代号 + ITKCALL(AOM_ask_value_string(taskTag, "zt2_ContractName", &contractName)); // 合同名称 + ITKCALL(AOM_ask_value_date(taskTag, "zt2_ChangeDate", &changeDate)); // 变更实施日期 + ITKCALL(AOM_ask_value_strings(taskTag, "zt2_ChangeUnit1",&unitCnt, &changeUnits)); // 合同名称 + ITKCALL(AOM_ask_value_string(taskTag, "zt2_ChangRequestNo", &changeRequestNo)); // 更改通知单号 + ITKCALL(AOM_ask_value_strings(taskTag, PROP_PROCESS, &processCnt, &processTypes)); cJSON* paramValue = cJSON_CreateObject(); //json添加字段 /*S_ProductFeature 产品特性 字符串 A; B; C @@ -273,7 +304,7 @@ int CHINT_ECN_SendOA(EPM_action_message_t msg) { cJSON_AddStringToObject(paramValue, "S_Pcodename", fileName); cJSON_AddStringToObject(paramValue, "S_Contractcode", contractNo); cJSON_AddStringToObject(paramValue, "S_ContractName", contractName); - DATE_date_to_string(changeDate, "%Y-%m-%d", &changeDateStr); + ITKCALL(DATE_date_to_string(changeDate, "%Y-%m-%d", &changeDateStr)); cJSON_AddStringToObject(paramValue, "T_MaterialDate", changeDateStr); cJSON_AddStringToObject(paramValue, "S_FFBM", changeUnits[0]); //EH_DrawingInformation图样信息 @@ -308,11 +339,12 @@ int CHINT_ECN_SendOA(EPM_action_message_t msg) { WriteLog("组织之后的JSON\n %s\n", json_to_char); WriteLog("回传信息\n %s\n", returnMsg.c_str()); if (!returnMsg.empty()) { - EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, returnMsg.c_str()); + ITKCALL(EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, returnMsg.c_str())); } } } + DisConnServer(); closeConn(); CloseLog(); //string str = uploadMinio("uploadMinio.jar", log_file); diff --git a/General/General/CRUL_server_call_httpserver.cpp b/General/General/CRUL_server_call_httpserver.cpp index 67d9368..0b1af7d 100644 --- a/General/General/CRUL_server_call_httpserver.cpp +++ b/General/General/CRUL_server_call_httpserver.cpp @@ -148,7 +148,11 @@ string readXmlId(string xmlMsg) { tinyxml2::XMLDocument doc; doc.Parse(U2G(xmlMsg.c_str())); tinyxml2::XMLElement* root = doc.RootElement(); + //tinyxml2::XMLElement* fault = root->FirstChildElement("Fault"); tinyxml2::XMLElement* typeEle = root->FirstChildElement("TYPE"); + if (typeEle == NULL) { + return "Fault"; + } tinyxml2::XMLElement* item = root->FirstChildElement("items"); char * type = (char*)typeEle->GetText(); if (strcmp(type, "S") == 0) { @@ -159,8 +163,28 @@ string readXmlId(string xmlMsg) { } return typeEle->GetText(); } -/*获取用户ID -*/ +string readXmlEmailId(string xmlMsg) { + printf("xmlMsg %s \n", xmlMsg.c_str()); + tinyxml2::XMLDocument doc; + doc.Parse(U2G(xmlMsg.c_str())); + tinyxml2::XMLElement* root = doc.RootElement(); + //tinyxml2::XMLElement* fault = root->FirstChildElement("Fault"); + tinyxml2::XMLElement* typeEle = root->FirstChildElement("TYPE"); + if (typeEle == NULL) { + return "Fault"; + } + tinyxml2::XMLElement* item = root->FirstChildElement("items"); + char * type = (char*)typeEle->GetText(); + if (strcmp(type, "S") == 0) { + printf("1111"); + tinyxml2::XMLElement* itemsCs = item->FirstChildElement("EH_HR_UserItems_CS"); + tinyxml2::XMLElement* code = itemsCs->FirstChildElement("Email"); + return code->GetText(); + } + return typeEle->GetText(); +} +/*获取用户ID(旧) + string getUserIdOA(string email, string url) { CURL* curl; CURLcode res; @@ -178,7 +202,7 @@ string getUserIdOA(string email, string url) { curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); string temp; //Email=string&Name=string %E9%82%B5%E9%AA%8F%E9%BD%90 - temp.append("Email=&Name=%E9%82%B5%E4%BF%8A%E9%BD%90");// .append("Email=").append("&Name=邵俊齐"); //.append(email) + temp.append("Email=&Name=%E9%82%B5%E4%BF%8A%E9%BD%90&UserUUID=");// .append("Email=").append("&Name=邵俊齐"); //.append(email) printf("temp=%s\n", temp.c_str()); const char* data = temp.c_str(); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); @@ -190,6 +214,79 @@ string getUserIdOA(string email, string url) { curl_easy_cleanup(curl); printf("return Msg===>%s\n", str_json.c_str()); return str_json; +}*/ +/*获取用户ID(旧) +*/ +string getUserIdOA(string email, string url) { + CURL* curl; + CURLcode res; + std::stringstream out; + curl = curl_easy_init(); + if (curl) { + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out); + struct curl_slist* headers = NULL; + headers = curl_slist_append(headers, "item: 2100004876"); + headers = curl_slist_append(headers, "wbs: "); + headers = curl_slist_append(headers, "factoryNo: "); + headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); + string temp = "Email="; //Email=string&Name=string %E9%82%B5%E9%AA%8F%E9%BD%90 + //temp.append("Email=&Name=%E9%82%B5%E4%BF%8A%E9%BD%90&UserUUID=");// .append("Email=").append("&Name=邵俊齐"); //.append(email) + temp.append(email).append("&Name=&UserUUID="); + printf("temp=%s\n", temp.c_str()); + const char* data = temp.c_str(); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); + res = curl_easy_perform(curl); + //curl_easy_strerror + printf("res=%d\n", res); + curl_slist_free_all(headers); + } + string str_json = out.str(); + curl_easy_cleanup(curl); + printf("return Msg===>%s\n", str_json.c_str()); + return str_json; +} +/*通过UUID获取用户ID +*/ +string getUserIdOAUUID(string uuid, string url) { + CURL* curl; + CURLcode res; + std::stringstream out; + curl = curl_easy_init(); + if (curl) { + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out); + struct curl_slist* headers = NULL; + headers = curl_slist_append(headers, "item: 2100004876"); + headers = curl_slist_append(headers, "wbs: "); + headers = curl_slist_append(headers, "factoryNo: "); + headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); + string temp; //Email=string&Name=string %E9%82%B5%E9%AA%8F%E9%BD%90 + temp.append("Email=&Name=&UserUUID=").append(uuid);// .append("Email=").append("&Name=邵俊齐"); //.append(email) + printf("temp=%s\n", temp.c_str()); + const char* data = temp.c_str(); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); + res = curl_easy_perform(curl); + //curl_easy_strerror + printf("res=%d\n", res); + curl_slist_free_all(headers); + } + string str_json = out.str(); + curl_easy_cleanup(curl); + printf("return Msg===>%s\n", str_json.c_str()); + return U2G(str_json.c_str()); } //解析OA的返回信息 string readXmlMSG(string xmlMsg) { diff --git a/General/General/CRUL_server_call_httpserver.h b/General/General/CRUL_server_call_httpserver.h index e9bfa53..e00654a 100644 --- a/General/General/CRUL_server_call_httpserver.h +++ b/General/General/CRUL_server_call_httpserver.h @@ -7,6 +7,8 @@ string callHttpGet(string url); string sendOA(string sfid, string instanceId, string entityParamValues, string url); string ecnSendOA(string instanceId, string entityParamValues, string url); string readXmlId(string xmlMsg); +string readXmlEmailId(string xmlMsg); string getUserIdOA(string email, string url); +string getUserIdOAUUID(string uuid, string url); string getAssignFromYP(string url); void updatePiProject(string json, string url); \ No newline at end of file diff --git a/General/General/CloneProcess.cpp b/General/General/CloneProcess.cpp index 8605251..6ce52ea 100644 --- a/General/General/CloneProcess.cpp +++ b/General/General/CloneProcess.cpp @@ -102,12 +102,12 @@ void updateTemGxCode(tag_t processTag, map temGxMap) { tag_t ebom_window = NULLTAG; tag_t bom_line = NULLTAG; tag_t item_tag = NULLTAG, *c_line_tags; - (BOM_create_window(&ebom_window)); + ITKCALL(BOM_create_window(&ebom_window)); tag_t* bvr_list = NULL; - (ITEM_rev_list_bom_view_revs(processTag, &bvr_count, &bvr_list)); + ITKCALL(ITEM_rev_list_bom_view_revs(processTag, &bvr_count, &bvr_list)); printf("bvr_count=%d", bvr_count); - (BOM_set_window_top_line_bvr(ebom_window, bvr_list[0], &bom_line)); //顶层bom获取 + ITKCALL(BOM_set_window_top_line_bvr(ebom_window, bvr_list[0], &bom_line)); //顶层bom获取 //bom_line工艺 int c_line_count; ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); // 一级工序 @@ -120,9 +120,9 @@ void updateTemGxCode(tag_t processTag, map temGxMap) { if (temGxMap.count(gxbm1) > 0) { char* oldName; TemGxBean temGxBean = temGxMap[gxbm1]; - AOM_lock(oneGxLine); - AOM_set_value_string(oneGxLine, "bl_ZT2_FirstOPRevision_zt2_ClassificationCode", temGxBean.temGxCode.c_str()); - AOM_save(oneGxLine); + ITKCALL(AOM_lock(oneGxLine)); + ITKCALL(AOM_set_value_string(oneGxLine, "bl_ZT2_FirstOPRevision_zt2_ClassificationCode", temGxBean.temGxCode.c_str())); + ITKCALL(AOM_save(oneGxLine)); AOM_unlock(oneGxLine); ITKCALL(AOM_ask_value_tag(oneGxLine, "bl_line_object", &oneGx)); ITKCALL(ITEM_ask_item_of_rev(oneGx, &gxItem)); @@ -326,27 +326,27 @@ void setZljyx(string gxbm2, string th,string lastId,string name,tag_t towGx) { if (beans.size()>0) { tag_t *tableRow; - ITEM_create_item(NULL, objName.c_str(), "ZT2_QCHECK", NULL, &item, &rev); - AOM_save(item); - AOM_save(rev); - AOM_lock(item); - AOM_lock(rev); + ITKCALL(ITEM_create_item(NULL, objName.c_str(), "ZT2_QCHECK", NULL, &item, &rev)); + ITKCALL(AOM_save(item)); + ITKCALL(AOM_save(rev)); + ITKCALL(AOM_lock(item)); + ITKCALL(AOM_lock(rev)); ITKCALL(AOM_insert_table_rows(rev, "zt2_QCHECKS", 0, beans.size(), &tableRow)); - AOM_save(rev); - AOM_unlock(rev); - AOM_save(item); - AOM_unlock(item); + ITKCALL(AOM_save(rev)); + ITKCALL(AOM_unlock(rev)); + ITKCALL(AOM_save(item)); + ITKCALL(AOM_unlock(item)); for (int i = 0; i < beans.size(); i++) { tag_t table = tableRow[i]; - AOM_lock(table); - AOM_set_value_string(table,"zt2_code", beans[i].no.c_str()); - AOM_set_value_string(table, "zt2_jjxbh", beans[i].mentNo.c_str()); - AOM_set_value_string(table, "zt2_jyxmc", beans[i].mentDesc.c_str()); - AOM_set_value_string(table, "zt2_jyxsjjg", beans[i].mentResult.c_str()); - AOM_save(table); - AOM_unlock(table); + ITKCALL(AOM_lock(table)); + ITKCALL(AOM_set_value_string(table,"zt2_code", beans[i].no.c_str())); + ITKCALL(AOM_set_value_string(table, "zt2_jjxbh", beans[i].mentNo.c_str())); + ITKCALL(AOM_set_value_string(table, "zt2_jyxmc", beans[i].mentDesc.c_str())); + ITKCALL(AOM_set_value_string(table, "zt2_jyxsjjg", beans[i].mentResult.c_str())); + ITKCALL(AOM_save(table)); + ITKCALL(AOM_unlock(table)); } - AOM_save(towGx); + ITKCALL(AOM_save(towGx)); save_representation2(towGx, item, "ZT2_QualityCheckRelation"); } @@ -403,7 +403,7 @@ void getGxbmMap(tag_t processTag, map& gxDocMap, map 0) { vector beansVec = flBeanMap[gxbm2]; printf("beansVec===>%zd\n", beansVec.size()); diff --git a/General/General/DtoEBOM2 - 鍓湰.cpp b/General/General/DtoEBOM2 - 鍓湰.cpp new file mode 100644 index 0000000..daaee5b --- /dev/null +++ b/General/General/DtoEBOM2 - 鍓湰.cpp @@ -0,0 +1,1686 @@ +#include +#include +#include +#include "epm_handler_common.h" +#include "ado.h" +#include +#include +#include +#include +#include +#include "ps/ps.h"; +#include "ps/vrule.h" +#include "sstream" +#include +#include "epm/epm.h" +#include "sa/sa.h" +#include "libxl.h" +#include +#include "epm/signoff.h" +#include +#include +#include +#include +#include "ae/dataset.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// #include "hx_custom.h" +#include +#include "tc_log.h" +// #include "jk_custom.h" +#include "chint_Handler.h" +#include "tc_util.h" +#include "ocilib.h" +struct NodeBean +{ + int topNum = 1; + int packNum = 0; //打包信息 + string revUid; //物料信息 + tag_t designRev; //图纸信息 + tag_t mantr = NULLTAG; + string bl_quantity; //数量 + char* bl_plmxml_occ_xform; //BOM属性 + string bl_sequence_no; // 查找编号 + vector childs;//子件 + vector ccps;//产成品 + int xnNum = 1;//虚拟件数量累乘 + boolean isOutBuy = false;//记录是否外购、或者权限不是自己的 +}; +bool isTcm(tag_t mantr) { + int releaseCount = 0; + tag_t* releaseTags = NULL; + //判断子件是否发布 + AOM_ask_value_tags(mantr, "release_status_list", &releaseCount, &releaseTags); + if (releaseCount > 0) { + return true; + } + else { + return false; + } +} +//判断物料的BOM视图有没有发布 +bool isBomViewTcm(tag_t mantr) { + int structs = 0; + tag_t *structure_revisions; + //版本有BOM视图且发布 + AOM_ask_value_tags(mantr, "structure_revisions", &structs, &structure_revisions); + if (structs > 0) { + return isTcm(structure_revisions[0]); + } + else { + return false; + } +} +bool myCompare(string o1, string o2) { + if (o1.rfind("3", 0) == 0) { + cout << o1.c_str() << endl; + return 1; + } + return 0; +} +vector KeySet(map test) +{ + vector keys; + for (map::iterator it = test.begin(); it != test.end(); ++it) { + keys.push_back(it->first); + } + return keys; +} +string& replace_all2(string& str, const string& old_value, const string& new_value) +{ + if (strstr(str.c_str(), old_value.c_str()) != NULL) { + vector type_vec; + Split(str.c_str(), old_value.c_str(), type_vec); + char new_str[512] = "\0"; + for (int i = 0; i < type_vec.size(); i++) + { + strcat(new_str, type_vec[i].c_str()); + if (i < type_vec.size() - 1) { + strcat(new_str, new_value.c_str()); + } + } + string new_value(new_str); + str = new_value.c_str(); + } + return str; +} +tag_t getSapPart(tag_t designRevLine, tag_t designRev, string& errBuff, NodeBean& bean) { + int num = 0; + tag_t* mantrs; + char *type, *item_id; + ITKCALL(AOM_ask_value_string(designRev, "object_type", &type)); + ITKCALL(AOM_ask_value_string(designRev, "item_id", &item_id)); + printf("designRev===>%s\n", item_id); + if (strcmp(type, "Part Revision") == 0) { + return designRev; + } + ITKCALL(AOM_ask_value_tags(designRev, "representation_for", &num, &mantrs)); + + //新增逻辑 获取图纸下最新版本的E物料对象 会存在多个版本的 + + vector parts; + if (strstr(item_id, "1ZDB300000P") != NULL) { + map partsCcp; + for (int i = 0; i < num; i++) { + char* type, *zt2_ifpbom, *itemId; + ITKCALL(AOM_ask_value_string(mantrs[i], "object_type", &type)); + ITKCALL(AOM_ask_value_string(mantrs[i], "zt2_ifpbom", &zt2_ifpbom)); + ITKCALL(AOM_ask_value_string(mantrs[i], "item_id", &itemId)); + if (strstr(type, "Part") != NULL && strcmp(zt2_ifpbom, "P") != 0) { // + tag_t matnrItem; + ITEM_ask_item_of_rev(mantrs[i], &matnrItem); + partsCcp[itemId] = matnrItem; + } + } + map::iterator it; + for (it = partsCcp.begin(); it != partsCcp.end(); it++) { + string s = it->first; + tag_t partLast = partsCcp[s], partRevLast; + ITEM_ask_latest_rev(partLast, &partRevLast); + if (parts.size() == 0) { + parts.push_back(partRevLast); + } + else { + printf("===========\n"); + bean.ccps.push_back(partRevLast); + } + } + } + else { + map partsCcp; + for (int i = 0; i < num; i++) { + char* type, *zt2_ifpbom, *itemId; + AOM_ask_value_string(mantrs[i], "object_type", &type); + AOM_ask_value_string(mantrs[i], "zt2_ifpbom", &zt2_ifpbom); + AOM_ask_value_string(mantrs[i], "item_id", &itemId); + if (strstr(type, "Part") != NULL && strcmp(zt2_ifpbom, "P") != 0) { // + tag_t matnrItem; + ITEM_ask_item_of_rev(mantrs[i], &matnrItem); + partsCcp[itemId] = matnrItem; + } + } + map::iterator it; + for (it = partsCcp.begin(); it != partsCcp.end(); it++) { + string s = it->first; + tag_t partLast = partsCcp[s], partRevLast; + ITEM_ask_latest_rev(partLast, &partRevLast); + if (parts.size() == 0) { + parts.push_back(partRevLast); + } + } + //for (int i = 0; i < num; i++) { + // char* type, *zt2_ifpbom; + // AOM_ask_value_string(mantrs[i], "object_type", &type); + // AOM_ask_value_string(mantrs[i], "zt2_ifpbom", &zt2_ifpbom); + // if (strstr(type, "Part") != NULL && strcmp(zt2_ifpbom, "P") != 0) { // + // tag_t matnrItem, partRevLast; + // ITEM_ask_item_of_rev(mantrs[i], &matnrItem); + // ITEM_ask_latest_rev(matnrItem, &partRevLast); + // parts.push_back(partRevLast); + // } + //} + } + if (parts.size() == 1) { + return parts[0]; + } + string searchId; + char* id, *zt2_TYJNo, *spec, *zt2_Diagram; + ITKCALL(AOM_ask_value_string(designRev, "zt2_Diagram", &zt2_Diagram)); + ITKCALL(AOM_ask_value_string(designRev, "item_id", &id)); + //AOM_ask_value_string(designRev, "zt2_DrawingNo", &zt2_DrawingNo); + /*if (strcmp(zt2_DrawingNo,"") != 0 && strcmp(zt2_DrawingNo, id) != 0) { + searchId = zt2_DrawingNo; + } + else {*/ + searchId = id; + //} + ITKCALL(AOM_ask_value_string(designRevLine, "ZT2_TYSpecifications", &zt2_TYJNo)); + ITKCALL(AOM_ask_value_string(designRev, "zt2_Specifications", &spec)); + printf("zt2_TYJNo===>%s\n", zt2_TYJNo); + if (strcmp(zt2_TYJNo, "") != 0) { + string qryVal; + tag_t query = NULLTAG, *tags; + map map_revs; + qryVal.append("* ").append(zt2_TYJNo).append("*"); + //fields.put("描述", "*" + item_id + "*" + zt2_TYJNo + "*"); + ITKCALL(QRY_find2("chint_query_material_test", &query)); + char* qry_entries[2] = { "描述" ,"关联的图号" }, *qry_values[2] = { (char *)qryVal.c_str(),id }; + int n_found; + ITKCALL(QRY_execute(query, 2, qry_entries, qry_values, &n_found, &tags)); + printf("n_found===>%d\n", n_found); + for (int t = 0; t < n_found; t++) { + tag_t rev = tags[t]; + if (isTcm(rev)) { + char* zt2_MaterialNo; + AOM_ask_value_string(rev, "zt2_MaterialNo", &zt2_MaterialNo); + map_revs[zt2_MaterialNo] = rev; + } + } + vector keySet = KeySet(map_revs); + sort(keySet.begin(), keySet.end(), myCompare); + for (int i = 0; i < keySet.size(); i++) { + string materialNo = keySet[i]; + string sql_query = "select FeatureList from CcemVW_GoodsFeature where GoodsCode ='"; + sql_query.append(materialNo).append("'"); + printf("sql_query===>%s\n", sql_query.c_str()); + int outputColumn = 0, outputValueCount = 0; + char*** outputValue = NULL; + ado_QuerySQLNoInputParam((char*)sql_query.c_str(), &outputColumn, &outputValueCount, &outputValue); + for (int j = 0; j < outputValueCount; j++) { + char* val = outputValue[j][0]; + vector vals; + Split(val, ",", vals); + for (int k = 0; k < vals.size(); k++) { + printf("vals===>%s\n", vals[k].c_str()); + if (vals[k].rfind("F064:", 0) == 0) { + string temp = replace_all2(vals[k], "F064:", ""); + printf("temp===>%s\n", temp.c_str()); + if (strstr(zt2_TYJNo, temp.c_str()) != NULL) { + return map_revs[materialNo]; + } + break; + } + } + } + } + if (!strcmp(zt2_Diagram, "Y") == 0 && !strcmp(zt2_Diagram, "是") == 0) { + string buffErr = ""; + buffErr.append("缺少物料编码[找不到与通用件规格相匹配的物料-(*").append(searchId) + .append("*").append(zt2_TYJNo).append(")];\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + return NULLTAG; + } + } + + for (int i = 0; i < parts.size(); i++) { + tag_t part = parts[i]; + char* specPart; + AOM_ask_value_string(part, "zt2_Specifications", &specPart); + if (strcmp(specPart, spec) == 0) { + return part; + } + /*String spec2 = parts.get(i).getProperty("zt2_Specifications"); + if (spec.equals(spec2)) { + return parts.get(i); + }*/ + } + if (!strcmp(zt2_Diagram, "Y") == 0 && !strcmp(zt2_Diagram, "是") == 0) { + //errBuff.append("缺少物料编码[找不到相同规格的物料(").append(spec).append(")];"); + string buffErr = ""; + buffErr.append("缺少物料编码[找不到相同规格的物料(").append(spec).append(")];"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + return NULLTAG; + } + + return NULLTAG; + /*else{ + return NULLTAG; + }*/ +} + +/** + * 遍历DBOM + * @param bom_line DBOM的父级 + * @param bean 记录BOM结构 + * @param errBuff 记录错误信息 + * @param designRev 图纸版本 + * @param flagMat 是否外购 + */ +void askLineVal(NodeBean& bean, tag_t bom_line, tag_t designRev, string& errBuff, boolean &flagMat) { + char* bl_quantity, *bl_plmxml_occ_xform, *bl_sequence_no, *sffc; + ITKCALL(AOM_ask_value_string(bom_line, "bl_sequence_no", &bl_sequence_no)); + //printf("revUid===>%s\n", bl_sequence_no); + ITKCALL(AOM_ask_value_string(bom_line, "bl_quantity", &bl_quantity)); + //printf("revUid===>%s\n", bl_quantity); + ITKCALL(AOM_ask_value_string(bom_line, "bl_plmxml_occ_xform", &bl_plmxml_occ_xform)); + //printf("revUid===>%s\n", bl_plmxml_occ_xform); + if (strcmp(bl_quantity, "") == 0) { + bl_quantity = "1"; + } + + bean.bl_plmxml_occ_xform = bl_plmxml_occ_xform; + if (bean.xnNum > 1) { + int qtyCut = atoi(bl_quantity); + bean.bl_quantity = to_string(qtyCut*bean.xnNum); + } + else { + bean.bl_quantity = bl_quantity; + } + if (strcmp(bean.bl_sequence_no.c_str(), "") == 0) { + bean.bl_sequence_no = bl_sequence_no; + } + //根据图纸获取物料 包含通用件的逻辑 + tag_t part = getSapPart(bom_line, designRev, errBuff, bean); + //printf("11111111\n"); + if (part != NULLTAG) { + //BOM_writer + char* name, *partId, **sealeds, **factorys, *matnr, **procureType; + AOM_refresh(part, false); + AOM_ask_value_string(part, "object_name", &name); + int cnt2, numFac, cnt3; + //检查物料是否可用 + ITKCALL(AOM_ask_value_string(part, "item_id", &partId)); + printf("part===>%s %s\n", partId, name); + AOM_ask_value_string(part, "zt2_MaterialNo", &matnr); + if (strcmp(matnr, "") == 0) { + string buffErr = ""; + buffErr.append("物料:").append(partId).append("/").append(name).append("没有物料编码.\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + //errBuff.append("物料:").append(partId).append("/").append(name).append("没有物料编码.\n"); + //return; + } + boolean numFlag = true; + AOM_ask_value_strings(part, "zt2_SZSealedornot", &cnt2, &sealeds); + AOM_ask_value_strings(part, "zt2_SZFactory", &numFac, &factorys); + AOM_ask_value_strings(part, "zt2_SZProcuretype", &cnt3, &procureType); //包含自制 + for (int i = 0; i < numFac; i++) { + if (strcmp(factorys[i], "M060") == 0) { + numFlag = false; + } + if (strcmp(factorys[i], "M060") == 0 && cnt2 > i) { + if (strcmp(sealeds[i], "Y") == 0) { + //errBuff.append("物料:").append(partId).append("/").append(name).append("已封存无法转换EBOM.\n"); + string buffErr = ""; + buffErr.append("物料:").append(partId).append("/").append(name).append("已封存无法转换EBOM.\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + } + if (cnt3 > i && strstr(procureType[i], "自制") != NULL) { + flagMat = true; + } + } + } + char*objName; + AOM_ask_value_string(part, OBJECT_NAME, &objName); + if (numFlag && strstr(objName, CCP_NAME) == NULL) {// || (strstr(partId,"2ZD")!=NULL|| strstr(partId, "4ZD") != NULL) + string buffErr = ""; + buffErr.append("物料:").append(partId).append("/").append(name).append("物料视图没有维护,请检查.\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + //errBuff.append("物料:").append(partId).append("/").append(name).append("物料视图没有维护,请检查.\n"); + } + ITKCALL(AOM_ask_value_string(part, "zt2_State", &sffc)); + if (strcmp(sffc, "D1") == 0 || strcmp(sffc, "封存") == 0) { + string buffErr = ""; + buffErr.append("物料:").append(partId).append("/").append(name).append("已封存无法转换EBOM.\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + } + bean.mantr = part; + } + else { + char *partId, *name; + AOM_ask_value_string(designRev, "item_id", &partId); + AOM_ask_value_string(designRev, "object_name", &name); + + string buffErr = ""; + buffErr.append("图纸:").append(partId).append("/").append(name).append("下未找到物料对象.\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + // errBuff.append("图纸:").append(partId).append("/").append(name).append("下未找到物料对象.\n"); + } +} +/** + * 获取通用件重量 + * @param bom_line DBOM + * @param materialutilization 材料利用率 + * @param errMessage 记录错误信息 + * @param desginRev 图纸版本 + */ +string getTyjZl(tag_t bom_line, string materialutilization, tag_t desginRev, string &errMessage) { + char *ZT2_TYSpecifications, *ZT2_TYWeight, *item_id; + AOM_ask_value_string(bom_line, "item_id", &item_id); + AOM_ask_value_string(bom_line, "ZT2_TYSpecifications", &ZT2_TYSpecifications); + double lyl = 0.85; + char strff[21]; + if (!materialutilization.empty()) { + lyl = stod(materialutilization); + } + if (strcmp(ZT2_TYSpecifications, "") == 0) { + double weight = 0; + AOM_ask_value_double(desginRev, "zt2_DesignWeight", &weight); + if (weight == 0) { + errMessage.append(item_id).append("未填写设计重量;\n"); + return "0"; + } + double two = weight / lyl; + sprintf(strff, "%.3f", two); + } + else { + AOM_ask_value_string(bom_line, "ZT2_TYWeight", &ZT2_TYWeight); + if (strcmp(ZT2_TYWeight, "") == 0) { + errMessage.append(item_id).append("未填写通用件重量;\n"); + return "0"; + } + double weight = stod(ZT2_TYWeight); + double two = weight / lyl; + sprintf(strff, "%.3f", two); + } + return strff; +} + +void getRemarkMsg(string remark, int len, string &errBuff, char*bl_quantity, char* pId, + char*c_pId, char*bl_line_name) { + char* idss[5] = { (char*)"A",(char*)"B",(char*)"C",(char*)"D",(char*)"E" }; + //tring x = "9A9.1B2C3"; + string markMsg = ""; + for (int i = 0; i < len; i++) { + if (strstr(remark.c_str(), idss[i]) != NULL) { + markMsg.append(idss[i]); + } + } + if (markMsg.length() == 0) { + int blQty = atoi(bl_quantity); + if (blQty % len != 0 + && strstr(bl_line_name, "线") == NULL) { + errBuff.append("图纸:").append(pId).append("下子件").append(c_pId) + .append("无法整除,请检查。").append("\n"); + } + } + else { + int blQty = atoi(bl_quantity); + if (blQty % markMsg.length() != 0 + && strstr(bl_line_name, "线") == NULL) { + errBuff.append("图纸:").append(pId).append("下子件").append(c_pId) + .append("无法整除,请检查。").append("\n"); + } + } +} + +int xsLen = 0; +void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, + string& errBuff, string dbName, NodeBean& pBean, int qtyXn, char *loginUserId); +void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, + string& errBuff, string dbName, NodeBean& pBean, int qtyXn, vector idVector); +/** + * 遍历DBOM + * @param bom_line DBOM的父级 + * @param pBean 记录BOM结构 + * @param errBuff 记录错误信息 + * @param dbName 原材料展开数据库信息 + * @param loginUserId 用户信息 + */ +void recyReadBom(tag_t bom_line, NodeBean& pBean, string& errBuff, string dbName, char *loginUserId) +{ + int c_line_count; + char* uid, *type, *zt2_Diagram, *source, *itemId, *object_name; + //图纸版本、子行 + tag_t designRev, *c_line_tags; + ITKCALL(AOM_ask_value_tag(bom_line, "bl_line_object", &designRev)); + //printf("1222"); + ITK__convert_tag_to_uid(designRev, &uid); + //printf("revUid===>%s\n", uid); + pBean.revUid = uid; + pBean.designRev = designRev; + ITKCALL(AOM_ask_value_string(designRev, "object_type", &type)); + ITKCALL(AOM_ask_value_string(designRev, "item_id", &itemId)); + ITKCALL(AOM_ask_value_string(designRev, "object_name", &object_name)); + printf("recyReadBom===>%s\n", itemId); + //printf("type===>%s\n", type); + if (strcmp(type, "ZT2_Design3DRevision") == 0) { + AOM_ask_value_string(designRev, "zt2_Diagram", &zt2_Diagram); + if (strcmp(zt2_Diagram, "Y") == 0 || strcmp(zt2_Diagram, "是") == 0) { + return; + } + } + //判断类型是否为 Part Revision ZT2_Design3DRevision ZT2_XNZJB 不是报错 + if (strcmp(type, "ZT2_Design3DRevision") != 0 + && strcmp(type, "Part Revision") != 0 && strcmp(type, "ZT2_XNZJBRevision") != 0) { + string buffErr = ""; + buffErr.append("对象类型异常:").append(itemId).append("/").append(object_name).append("/").append(type).append("\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + return; + } + + boolean flagMat = false; + //根据图纸获取物料信息 + askLineVal(pBean, bom_line, designRev, errBuff, flagMat); + tag_t tagUser; + char *tagId; + AOM_ask_value_tag(designRev, "owning_user", &tagUser); + AOM_ask_value_string(tagUser, "user_id", &tagId); + //检查权限 + if (strcmp(type, "ZT2_Design3DRevision") == 0 && strcmp(loginUserId, tagId) != 0 && strstr(itemId, "2ZD") == NULL) { + pBean.isOutBuy = true; + return; + } + if (strcmp(type, "ZT2_XNZJBRevision") == 0) { + return; + } + //外购 不展开子件 + if (strstr(itemId, "2ZD") != NULL || strstr(itemId, "4ZD") != NULL) { + if (!flagMat) { + pBean.isOutBuy = true; + return; + } + } + if (strstr(itemId, "1ZD") != NULL) { + AOM_ask_value_string(designRev, "zt2_Source", &source); + if (strcmp(source, "S2") == 0 || strcmp(source, "外购") == 0) { + pBean.isOutBuy = true; + return; + } + } + + ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + for (int i = 0; i < c_line_count; i++) { + logical flag; + BOM_line_is_packed(c_line_tags[i], &flag); + if (flag) { + BOM_line_unpack(c_line_tags[i]); + } + } + AOM_refresh(bom_line, FALSE); + ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + //转换时原材料展开逻辑 + if (c_line_count == 0 && !dbName.empty() && (strstr(itemId, "1ZD") != NULL || + strstr(itemId, "2ZD") != NULL || strstr(itemId, "4ZD") != NULL)) { + //原材料展开 + char *zt2_MaterialMark; + AOM_ask_value_string(designRev, "zt2_MaterialMark", &zt2_MaterialMark); + //String zt2_MaterialMark = rev.getProperty("zt2_MaterialMark") + string sql = "select materialno, materialutilization, materialunit FROM %s where materialmark = '%s'"; + char selectRxfs[500]; + sprintf(selectRxfs, sql.c_str(), dbName.c_str(), zt2_MaterialMark); + int outputColumn1 = 0, outputValueCount1 = 0; + char*** outputValue1 = NULL; + printf("search3 ===> %s\n", selectRxfs); + QuerySQLNoInputParam(selectRxfs, &outputColumn1, &outputValueCount1, &outputValue1); + if (outputValueCount1 == 0 && strcmp(zt2_MaterialMark, "") != 0) { + string buffErr = ""; + buffErr.append("图纸:").append(itemId).append("-"). + append(object_name).append(zt2_MaterialMark).append("材料标记没有维护.\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + + } + for (int t = 0; t < outputValueCount1; t++) { + string materialno = outputValue1[t][0]; + string materialutilization = outputValue1[t][1]; + string materialunit = outputValue1[t][2]; + tag_t material, materialRev; + ITEM_find_item(materialno.c_str(), &material); + ITEM_ask_latest_rev(material, &materialRev); + string bl_qty = getTyjZl(bom_line, materialutilization, designRev, errBuff); + printf("bl_qty%s\n", bl_qty.c_str()); + NodeBean cBean; + cBean.bl_quantity = bl_qty; + cBean.bl_sequence_no = "10"; + cBean.bl_plmxml_occ_xform = ""; + cBean.mantr = materialRev; + pBean.childs.push_back(cBean); + } + } + string maxSeqNo; + vector xnzjbVec; + string item_id = itemId; + smatch result; + //检查是否线圈 + regex qq_reg2("^1ZDB5.*\\d{1,}1000X.*"); + bool ret = regex_match(item_id, result, qq_reg2); + for (int i = 0; i < c_line_count; i++) { + logical suppressed; + AOM_ask_value_logical(c_line_tags[i], "bl_is_occ_suppressed", &suppressed); + if (suppressed) { + continue; + } + //修改过之后之前已经是解包的状态了 + logical flag; + BOM_line_is_packed(c_line_tags[i], &flag); + //printf("flag===>%d\n", flag); + if (flag) { + int count = 0; + char *topNum; + AOM_ask_value_string(c_line_tags[i], "bl_quantity", &topNum); + tag_t* packLines; + BOM_line_ask_packed_lines(c_line_tags[i], &count, &packLines); + for (int t = 0; t < count; t++) { + tag_t c_Rev; + ITKCALL(AOM_ask_value_tag(packLines[t], "bl_line_object", &c_Rev)); + char* cUid; + ITK__convert_tag_to_uid(c_Rev, &cUid); + NodeBean cBean; + cBean.revUid = cUid; + cBean.designRev = c_Rev; + cBean.packNum = count + 1; + cBean.topNum = atoi(topNum); + recyReadBom(c_line_tags[i], cBean, errBuff, dbName, loginUserId); + pBean.childs.push_back(cBean); + } + AOM_refresh(c_line_tags[i], FALSE); + tag_t c_Rev; + ITKCALL(AOM_ask_value_tag(c_line_tags[i], "bl_line_object", &c_Rev)); + char* cUid; + ITK__convert_tag_to_uid(c_Rev, &cUid); + NodeBean cBean; + cBean.revUid = cUid; + cBean.designRev = c_Rev; + cBean.packNum = count + 1; + cBean.topNum = atoi(topNum); + recyReadBom(c_line_tags[i], cBean, errBuff, dbName, loginUserId); + pBean.childs.push_back(cBean); + + } + else { + //检查E转P时的拆分逻辑 + tag_t c_Rev; + char *seqNo, *c_type, *remark, *bl_quantity, *bl_line_name; + ITKCALL(AOM_ask_value_tag(c_line_tags[i], "bl_line_object", &c_Rev)); + char* id; + AOM_ask_value_string(c_Rev, "item_id", &id); + //获取BOM行的REMARK + if (ret) { + AOM_ask_value_string(c_line_tags[i], "ZT2_Remark", &remark); + AOM_ask_value_string(c_line_tags[i], "bl_quantity", &bl_quantity); + AOM_ask_value_string(c_line_tags[i], "bl_line_name", &bl_line_name); + getRemarkMsg(remark, xsLen, errBuff, bl_quantity, itemId, id, bl_line_name); + } + //新增逻辑 当前对象类型为ZT2_XNZJB 虚拟组件包时 进行削层处理 数量*虚拟层数量 + AOM_ask_value_string(c_Rev, "object_type", &c_type); + if (strcmp(c_type, "ZT2_XNZJBRevision") == 0) { + xnzjbVec.push_back(c_line_tags[i]); + continue; + } + AOM_ask_value_string(c_line_tags[i], "bl_sequence_no", &seqNo); + maxSeqNo = seqNo; + char* cUid; + ITK__convert_tag_to_uid(c_Rev, &cUid); + NodeBean cBean; + cBean.revUid = cUid; + cBean.designRev = c_Rev; + recyReadBom(c_line_tags[i], cBean, errBuff, dbName, loginUserId); + pBean.childs.push_back(cBean); + } + } + int maxNum = atoi(maxSeqNo.c_str()); + int xxt = 1; + printf("xnzjbVec ===> %d\n", xnzjbVec.size()); + //提取虚拟装配件的逻辑 + getAllXnj(xnzjbVec, maxNum, xxt, errBuff, dbName, pBean, 1, loginUserId); +} +/** + * DBOM转EBOM框架BOM使用 + * @param bom_line DBOM顶层 + * @param pBean 记录EBOM结构 + * @param errBuff 记录错误信息 + * @param dbName 原材料展开的数据表 + * @param idVector 需要D转E的BOM类别 + */ +void recyReadBom(tag_t bom_line, NodeBean& pBean, string& errBuff, string dbName, vector idVector) +{ + int c_line_count; + char* uid, *type, *zt2_Diagram, *source, *itemId, *object_name; + //图纸版本、子行 + tag_t designRev, *c_line_tags; + ITKCALL(AOM_ask_value_tag(bom_line, "bl_line_object", &designRev)); + //printf("1222"); + ITK__convert_tag_to_uid(designRev, &uid); + //printf("revUid===>%s\n", uid); + pBean.revUid = uid; + pBean.designRev = designRev; + ITKCALL(AOM_ask_value_string(designRev, "object_type", &type)); + ITKCALL(AOM_ask_value_string(designRev, "item_id", &itemId)); + ITKCALL(AOM_ask_value_string(designRev, "object_name", &object_name)); + //printf("type===>%s\n", type); + printf("recyReadBom2===>%s\n", itemId); + if (strcmp(type, "ZT2_Design3DRevision") == 0) { + AOM_ask_value_string(designRev, "zt2_Diagram", &zt2_Diagram); + if (strcmp(zt2_Diagram, "Y") == 0 || strcmp(zt2_Diagram, "是") == 0) { + return; + } + } + //判断类型是否为 Part Revision ZT2_Design3DRevision ZT2_XNZJB 不是报错 + if (strcmp(type, "ZT2_Design3DRevision") != 0 + && strcmp(type, "Part Revision") != 0 && strcmp(type, "ZT2_XNZJBRevision") != 0) { + string buffErr = ""; + buffErr.append("对象类型异常:").append(itemId).append("/").append(object_name).append("/").append(type).append("\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + return; + } + + boolean flagMat = false; + askLineVal(pBean, bom_line, designRev, errBuff, flagMat); + vector idVec; + Split(itemId, "-", idVec); + //未在首选项配置的类型不展开 + if (std::find(idVector.begin(), idVector.end(), idVec[0]) == idVector.end()) { + return; + } + if (strcmp(type, "ZT2_XNZJBRevision") == 0) { + return; + } + //外购 不展开子件 + if (strstr(itemId, "2ZD") != NULL || strstr(itemId, "4ZD") != NULL) { + if (!flagMat) { + return; + } + } + if (strstr(itemId, "1ZD") != NULL) { + AOM_ask_value_string(designRev, "zt2_Source", &source); + if (strcmp(source, "S2") == 0 || strcmp(source, "外购") == 0) { + return; + } + } + + ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + for (int i = 0; i < c_line_count; i++) { + logical flag; + BOM_line_is_packed(c_line_tags[i], &flag); + if (flag) { + BOM_line_unpack(c_line_tags[i]); + } + } + AOM_refresh(bom_line, FALSE); + ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + //转换时原材料展开逻辑 + if (c_line_count == 0 && !dbName.empty() && (strstr(itemId, "1ZD") != NULL || + strstr(itemId, "2ZD") != NULL || strstr(itemId, "4ZD") != NULL)) { + //原材料展开 + char *zt2_MaterialMark; + AOM_ask_value_string(designRev, "zt2_MaterialMark", &zt2_MaterialMark); + //String zt2_MaterialMark = rev.getProperty("zt2_MaterialMark") + string sql = "select materialno, materialutilization, materialunit FROM %s where materialmark = '%s'"; + char selectRxfs[500]; + sprintf(selectRxfs, sql.c_str(), dbName.c_str(), zt2_MaterialMark); + int outputColumn1 = 0, outputValueCount1 = 0; + char*** outputValue1 = NULL; + printf("search3 ===> %s\n", selectRxfs); + QuerySQLNoInputParam(selectRxfs, &outputColumn1, &outputValueCount1, &outputValue1); + if (outputValueCount1 == 0 && strcmp(zt2_MaterialMark, "") != 0) { + string buffErr = ""; + buffErr.append("图纸:").append(itemId).append("-"). + append(object_name).append(zt2_MaterialMark).append("材料标记没有维护.\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + + } + for (int t = 0; t < outputValueCount1; t++) { + string materialno = outputValue1[t][0]; + string materialutilization = outputValue1[t][1]; + string materialunit = outputValue1[t][2]; + tag_t material, materialRev; + ITEM_find_item(materialno.c_str(), &material); + ITEM_ask_latest_rev(material, &materialRev); + string bl_qty = getTyjZl(bom_line, materialutilization, designRev, errBuff); + printf("bl_qty%s\n", bl_qty.c_str()); + NodeBean cBean; + cBean.bl_quantity = bl_qty; + cBean.bl_sequence_no = "10"; + cBean.bl_plmxml_occ_xform = ""; + cBean.mantr = materialRev; + pBean.childs.push_back(cBean); + } + } + string maxSeqNo; + vector xnzjbVec; + for (int i = 0; i < c_line_count; i++) { + logical suppressed; + AOM_ask_value_logical(c_line_tags[i], "bl_is_occ_suppressed", &suppressed); + if (suppressed) { + continue; + } + //修改过之后之前已经是解包的状态了 + logical flag; + BOM_line_is_packed(c_line_tags[i], &flag); + //printf("flag===>%d\n", flag); + if (flag) { + int count = 0; + char *topNum; + AOM_ask_value_string(c_line_tags[i], "bl_quantity", &topNum); + tag_t* packLines; + BOM_line_ask_packed_lines(c_line_tags[i], &count, &packLines); + for (int t = 0; t < count; t++) { + tag_t c_Rev; + ITKCALL(AOM_ask_value_tag(packLines[t], "bl_line_object", &c_Rev)); + char* cUid; + ITK__convert_tag_to_uid(c_Rev, &cUid); + NodeBean cBean; + cBean.revUid = cUid; + cBean.designRev = c_Rev; + cBean.packNum = count + 1; + cBean.topNum = atoi(topNum); + recyReadBom(c_line_tags[i], cBean, errBuff, dbName, idVector); + pBean.childs.push_back(cBean); + } + AOM_refresh(c_line_tags[i], FALSE); + tag_t c_Rev; + ITKCALL(AOM_ask_value_tag(c_line_tags[i], "bl_line_object", &c_Rev)); + char* cUid; + ITK__convert_tag_to_uid(c_Rev, &cUid); + NodeBean cBean; + cBean.revUid = cUid; + cBean.designRev = c_Rev; + cBean.packNum = count + 1; + cBean.topNum = atoi(topNum); + recyReadBom(c_line_tags[i], cBean, errBuff, dbName, idVector); + pBean.childs.push_back(cBean); + + } + else { + tag_t c_Rev; + char *seqNo, *c_type; + ITKCALL(AOM_ask_value_tag(c_line_tags[i], "bl_line_object", &c_Rev)); + //新增逻辑 当前对象类型为ZT2_XNZJB 虚拟组件包时 进行削层处理 数量*虚拟层数量 + AOM_ask_value_string(c_Rev, "object_type", &c_type); + if (strcmp(c_type, "ZT2_XNZJBRevision") == 0) { + xnzjbVec.push_back(c_line_tags[i]); + continue; + } + AOM_ask_value_string(c_line_tags[i], "bl_sequence_no", &seqNo); + maxSeqNo = seqNo; + char* cUid; + ITK__convert_tag_to_uid(c_Rev, &cUid); + NodeBean cBean; + cBean.revUid = cUid; + cBean.designRev = c_Rev; + recyReadBom(c_line_tags[i], cBean, errBuff, dbName, idVector); + pBean.childs.push_back(cBean); + } + } + int maxNum = atoi(maxSeqNo.c_str()); + int xxt = 1; + printf("xnzjbVec ===> %d\n", xnzjbVec.size()); + + getAllXnj(xnzjbVec, maxNum, xxt, errBuff, dbName, pBean, 1, idVector); +} +/** + * 提取虚拟装配件 + * @param xnzjbVec 虚拟装配件版本集合 + * @param maxNum 提取之后的查找编号 + * @param xxt 查找编号累加的 + * @param errBuff 错误信息 + * @param dbName 原材料展开数据表 + * @param qtyXn 提取时需要累乘数量 + * @param idVector 需要展开的ID类别 + */ +void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, + string& errBuff, string dbName, NodeBean& pBean, int qtyXn, vector idVector) { + + + for (int t = 0; t < xnzjbVec.size(); t++) { + tag_t c_line_tag = xnzjbVec[t], *cc_line_tags; + int cc_line_count; + ITKCALL(BOM_line_ask_all_child_lines(c_line_tag, &cc_line_count, &cc_line_tags)); + char *cnt, *c_type; + int qtyPXn = 1; + AOM_ask_value_string(c_line_tag, "bl_quantity", &cnt); + if (strcmp(cnt, "") != 0) { + qtyPXn = atoi(cnt); + } + //qtyPXn = qtyPXn * qtyXn; + vector xnzjbVec2; + for (int j = 0; j < cc_line_count; j++) { + tag_t c_Rev; + char *itemId, *object_name; + ITKCALL(AOM_ask_value_tag(cc_line_tags[j], "bl_line_object", &c_Rev)); + AOM_ask_value_string(c_Rev, "object_type", &c_type); + AOM_ask_value_string(c_Rev, "item_id", &itemId); + AOM_ask_value_string(c_Rev, "object_name", &object_name); + if (strcmp(c_type, "ZT2_XNZJBRevision") == 0) { + printf("itemId===>%s\n", itemId); + xnzjbVec2.push_back(cc_line_tags[j]); + continue; + } + //判断类型是否为 Part Revision ZT2_Design3DRevision ZT2_XNZJB 不是报错 + if (strcmp(c_type, "ZT2_Design3DRevision") != 0 + && strcmp(c_type, "Part Revision") != 0) { + string buffErr = ""; + buffErr.append("对象类型异常:").append(itemId).append("/").append(object_name).append("/").append(c_type).append("\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + } + NodeBean cBean; + char* cUid; + ITK__convert_tag_to_uid(c_Rev, &cUid); + cBean.revUid = cUid; + cBean.designRev = c_Rev; + cBean.xnNum = qtyXn * qtyPXn; + int srqNum = maxNum + xxt * 10; + string lastnum = to_string(srqNum); + xxt = xxt + 1; + cBean.bl_sequence_no = lastnum; + recyReadBom(cc_line_tags[j], cBean, errBuff, dbName, idVector); + pBean.childs.push_back(cBean); + } + printf("xnzjbVec2 ===> %d ==>%d \n", xnzjbVec2.size(), qtyPXn); + if (xnzjbVec2.size() > 0) { + getAllXnj(xnzjbVec2, maxNum, xxt, errBuff, dbName, pBean, qtyPXn, idVector); + } + } +} +/** + * 提取虚拟装配件 + * @param xnzjbVec 虚拟装配件版本集合 + * @param maxNum 提取之后的查找编号 + * @param xxt 查找编号累加的 + * @param errBuff 错误信息 + * @param dbName 原材料展开数据表 + * @param qtyXn 提取时需要累乘数量 + * @param loginUserId 用户ID + */ +void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, + string& errBuff, string dbName, NodeBean& pBean, int qtyXn, char *loginUserId) { + + for (int t = 0; t < xnzjbVec.size(); t++) { + tag_t c_line_tag = xnzjbVec[t], *cc_line_tags; + int cc_line_count; + ITKCALL(BOM_line_ask_all_child_lines(c_line_tag, &cc_line_count, &cc_line_tags)); + char *cnt, *c_type; + int qtyPXn = 1; + AOM_ask_value_string(c_line_tag, "bl_quantity", &cnt); + if (strcmp(cnt, "") != 0) { + //虚拟件的BOM数量 + qtyPXn = atoi(cnt); + } + //qtyPXn = qtyPXn * qtyXn; + vector xnzjbVec2; + for (int j = 0; j < cc_line_count; j++) { + tag_t c_Rev; + char *itemId, *object_name; + ITKCALL(AOM_ask_value_tag(cc_line_tags[j], "bl_line_object", &c_Rev)); + AOM_ask_value_string(c_Rev, "object_type", &c_type); + AOM_ask_value_string(c_Rev, "item_id", &itemId); + AOM_ask_value_string(c_Rev, "object_name", &object_name); + if (strcmp(c_type, "ZT2_XNZJBRevision") == 0) { + printf("itemId===>%s\n", itemId); + xnzjbVec2.push_back(cc_line_tags[j]); + continue; + } + //判断类型是否为 Part Revision ZT2_Design3DRevision ZT2_XNZJB 不是报错 + if (strcmp(c_type, "ZT2_Design3DRevision") != 0 + && strcmp(c_type, "Part Revision") != 0) { + string buffErr = ""; + buffErr.append("对象类型异常:").append(itemId).append("/").append(object_name).append("/").append(c_type).append("\n"); + size_t found = errBuff.find(buffErr); + if (found == std::string::npos) { + errBuff.append(buffErr); + } + } + NodeBean cBean; + char* cUid; + ITK__convert_tag_to_uid(c_Rev, &cUid); + cBean.revUid = cUid; + cBean.designRev = c_Rev; + cBean.xnNum = qtyXn * qtyPXn; + int srqNum = maxNum + xxt * 10; + string lastnum = to_string(srqNum); + xxt = xxt + 1; + cBean.bl_sequence_no = lastnum; + //非虚拟件的继续原逻辑展开 + recyReadBom(cc_line_tags[j], cBean, errBuff, dbName, loginUserId); + pBean.childs.push_back(cBean); + } + printf("xnzjbVec2 ===> %d ==>%d \n", xnzjbVec2.size(), qtyPXn); + //存在多层级的虚拟装配件,递归提取 + if (xnzjbVec2.size() > 0) { + getAllXnj(xnzjbVec2, maxNum, xxt, errBuff, dbName, pBean, qtyPXn, loginUserId); + } + } +} +string GBKToUTF8(const std::string& strGBK) +{ + string strOutUTF8 = ""; + WCHAR * str1; + int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0); + str1 = new WCHAR[n]; + MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n); + n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL); + char * str2 = new char[n]; + WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL); + strOutUTF8 = str2; + delete[]str1; + str1 = NULL; + delete[]str2; + str2 = NULL; + return strOutUTF8; +} +string proProcessCreate(tag_t rev, string process_name) +{ + tag_t template_tag = NULLTAG; + EPM_find_template2(process_name.c_str(), PROCESS_TEMPLATE, &template_tag); + tag_t new_process = NULLTAG; + int *tagType = (int *)MEM_alloc(1024 * sizeof(int));//EPM_reference_attachment + tag_t * itemTag = (tag_t *)MEM_alloc(1024 * sizeof(tag_t)); + tagType[0] = EPM_target_attachment; + itemTag[0] = rev; + EPM_create_process("快速发布", "", template_tag, 1, itemTag, tagType, &new_process); + return "1"; +} + +boolean firstRevision(tag_t designRev, tag_t mantr) { + char *revId; + int revNum = 0, statusNum = 0; + tag_t *structure_revisions; + AOM_ask_value_string(designRev, "item_revision_id", &revId); + AOM_ask_value_tags(mantr, "structure_revisions", &revNum, &structure_revisions); + if (revNum > 0) { + tag_t struct_revision = structure_revisions[0], *release_status_list; + AOM_ask_value_tags(struct_revision, "release_status_list", &statusNum, &release_status_list); + if (statusNum == 0) { + return false; + } + } + if (strcmp(revId, "V01") > 0) { + return true; + } + else { + return false; + } +} +/** + * 获取单层DBOM的信息 跟EBOM比较用的 + * @param topBean 记录的BOM结构 + */ +map getDBomMesg(NodeBean topBean) { + vector childs = topBean.childs; + map dMap; + for (int i = 0; i < childs.size(); i++) { + NodeBean cBean = childs[i]; + char *matnrNo, *uid; + AOM_ask_value_string(cBean.mantr, MATERIALNO, &matnrNo); + ITK__convert_tag_to_uid(cBean.mantr, &uid); + printf("uid[%s]\n", uid); + printf("matnrNo[%s]\n", matnrNo); + int qtyPXn = 1; + string cnt = cBean.bl_quantity; + if (strcmp(cnt.c_str(), "") != 0) { + qtyPXn = atoi(cnt.c_str()); + } + if (dMap.count(matnrNo) > 0) { + dMap[matnrNo] = dMap[matnrNo] + qtyPXn; + } + else { + dMap[matnrNo] = qtyPXn; + } + } + return dMap; +} +/** + * 获取单层EBOM的信息 跟DBOM比较用的 + * @param mantrRev E物料 + * @param flag 记录有没有bom视图 + */ +map getBomMsg(tag_t mantrRev, bool& flag) { + map bomMsgMap; + tag_t* bvr_list = NULL, bom_line, ebom_window; + int bvr_count = 0; + ITKCALL(ITEM_rev_list_bom_view_revs(mantrRev, &bvr_count, &bvr_list)); + //没有BOM视图创建 + if (bvr_count == 0) { + flag = true; + return bomMsgMap; + } + ITKCALL(BOM_create_window(&ebom_window)); + //移除原来的 + ITKCALL(BOM_set_window_top_line(ebom_window, NULL, mantrRev, NULLTAG, &bom_line)); + int c_line_count; + tag_t* c_line_tags; + ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + printf("c_line_count===>%d\n", c_line_count); + for (int t = 0; t < c_line_count; t++) { + tag_t c_Rev; + char *matnrNo, *cnt; + ITKCALL(AOM_ask_value_tag(c_line_tags[t], "bl_line_object", &c_Rev)); + AOM_ask_value_string(c_Rev, "zt2_MaterialNo", &matnrNo); + printf("zt2_MaterialNo===>%s\n", matnrNo); + int qtyPXn = 1; + AOM_ask_value_string(c_line_tags[t], "bl_quantity", &cnt); + if (strcmp(cnt, "") != 0) { + qtyPXn = atoi(cnt); + } + if (bomMsgMap.count(matnrNo) > 0) { + bomMsgMap[matnrNo] = bomMsgMap[matnrNo] + qtyPXn; + } + else { + bomMsgMap[matnrNo] = qtyPXn; + } + } + BOM_close_window(ebom_window); + return bomMsgMap; +} +/** + * 对比Ebom和Dbom + * @param dMap D物料编码 - 数量 + * @param eMap E物料编码 - 数量 + */ +boolean combEAndDbom(map dMap, map eMap) { + map::iterator it; + //名称模糊匹配 + for (it = dMap.begin(); it != dMap.end(); it++) { + string s = it->first; + int dnum = dMap[s]; + if (eMap.count(s) == 0) { + return true; + } + else if (dnum != eMap[s]) { + return true; + } + } + return false; +} +/** + * 发布并且修改所有权 + */ +void TCMAndOwner(tag_t matnrTop) { + int num = 0, revNum; + tag_t *mantrsAs, dsuser, *structure_revisions; + AOM_ask_value_tags(matnrTop, "TC_Is_Represented_By", &num, &mantrsAs); + AOM_ask_value_tag(mantrsAs[0], "owning_user", &dsuser); + tag_t defGroup; + ITKCALL(AOM_ask_value_tag(dsuser, "default_group", &defGroup)); + ITKCALL(AOM_set_ownership(matnrTop, dsuser, defGroup)); + if (num > 0) { + AOM_ask_value_tags(matnrTop, "structure_revisions", &revNum, &structure_revisions); + if (revNum > 0) { + ITKCALL(AOM_set_ownership(structure_revisions[0], dsuser, defGroup)); + } + } + /*string process_name = "TCM Release Process"; + proProcessCreate(matnrTop, process_name);*/ +} +/** + * 比较DBOM、EBOM是否相同,不同则升版 + * @param topBean 存放BOM信息 + * @param isTop 是否产成品 + * @param hasChange 是否发布 + * @param saveAsMap 存放升版之前的版本uid - 升版之后的新版本 存在打包的对象防止多次升版 + */ +tag_t saveAsMaterial(NodeBean topBean, boolean isTop, string &hasChange, map& saveAsMap) { + tag_t mantr = topBean.mantr;//升版之前的E物料 + char* oldUid; + ITK__convert_tag_to_uid(mantr, &oldUid); + if (saveAsMap.count(oldUid) > 0) { + return saveAsMap[oldUid]; + } + bool flag = false; + map dBomMesg = getDBomMesg(topBean); + map eBomMesg = getBomMsg(mantr, flag); + if (flag) { + return mantr; + } + printf("dBomMesg[%d]", dBomMesg.size()); + printf("eBomMesg[%d]", eBomMesg.size()); + boolean needAs = false; + if (dBomMesg.size() != eBomMesg.size()) { + //升版 + 发布 + needAs = true; + } + else if (combEAndDbom(dBomMesg, eBomMesg)) { + //升版 + 发布 + needAs = true; + } + if (needAs && !topBean.isOutBuy) { + printf("=======TEST======\n"); + //升版并发布 没发布的产成品直接更新 + if (isTcm(mantr) && isBomViewTcm(mantr)) { + ITKCALL(ITEM_copy_rev(mantr, NULL, &mantr)); + TCMAndOwner(mantr); + if (isTop) { + hasChange = true; + } + saveAsMap[oldUid] = mantr; + } + } + return mantr; +} +void createEbom(NodeBean topBean, boolean isTop, string &hasChange, map& saveAsMap) +{ + tag_t ebom_window = NULLTAG; + tag_t bom_line = NULLTAG; + vector childs = topBean.childs; + //printf("子line数量 %d \n", childs.size()); + tag_t desBean = topBean.designRev; + char* id; + AOM_ask_value_string(desBean, "item_id", &id); + printf("id %s \n", id); + tag_t mantr = topBean.mantr; + //判断是否最初版本 不是就和当前的EBOM进行比较 + //相同就跳过不升版、不同就升版、只比较数量 + //ITEM_ask_f + mantr = saveAsMaterial(topBean, isTop, hasChange, saveAsMap); + boolean flagChange = true; + + if (mantr != NULLTAG && childs.size() > 0) { + printf("-----"); + tag_t* bvr_list = NULL; + int bvr_count; + ITKCALL(ITEM_rev_list_bom_view_revs(mantr, &bvr_count, &bvr_list)); + //没有BOM视图创建 + if (bvr_count == 0) { + tag_t newView, newViewBvr, pitem, dsuser; + ITEM_ask_item_of_rev(mantr, &pitem); + ITKCALL(PS_create_bom_view(NULL, NULL, NULL, pitem, &newView)); + AOM_save(newView); + ITKCALL(PS_create_bvr(newView, NULL, NULL, FALSE, mantr, &newViewBvr)); + AOM_save(newViewBvr); + AOM_save(mantr); + AOM_ask_value_tag(desBean, "owning_user", &dsuser); + tag_t defGroup; + ITKCALL(AOM_ask_value_tag(dsuser, "default_group", &defGroup)); + ITKCALL(AOM_set_ownership(newView, dsuser, defGroup)); + ITKCALL(AOM_set_ownership(newViewBvr, dsuser, defGroup)); + } + ITKCALL(BOM_create_window(&ebom_window)); + //移除原来的 + char*topUidTest; + ITK__convert_tag_to_uid(mantr, &topUidTest); + printf("topUidTest =======> %s \n", topUidTest); + ITKCALL(BOM_set_window_top_line(ebom_window, NULL, mantr, NULLTAG, &bom_line)); + //变更当前BOM层级 已发布的不需要更改 + if (flagChange) { + if (bvr_count > 0) { + int c_line_count; + tag_t* c_line_tags; + ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + for (int t = 0; t < c_line_count; t++) { + char* val; + AOM_ask_value_string(c_line_tags[t], "bl_occ_zt2_DtoE", &val); + if (strcmp(val, "DBOM转换") == 0) { + BOM_line_cut(c_line_tags[t]); + } + } + } + for (int i = 0; i < childs.size(); i++) { + NodeBean cBean = childs[i]; + if (cBean.mantr != NULLTAG) { + tag_t cLine; + ITKCALL(BOM_line_add(bom_line, NULL, cBean.mantr, NULL, &cLine)); + AOM_lock(cLine); + if (cBean.packNum > 0) { + string num = cBean.bl_quantity; + num = to_string(cBean.topNum / cBean.packNum); + ITKCALL(AOM_set_value_string(cLine, "bl_quantity", num.c_str())); + } + else { + printf("num %s \n", cBean.bl_quantity.c_str()); + ITKCALL(AOM_set_value_string(cLine, "bl_quantity", cBean.bl_quantity.c_str())); + } + + + AOM_set_value_string(cLine, "bl_plmxml_occ_xform", cBean.bl_plmxml_occ_xform); + AOM_set_value_string(cLine, "bl_sequence_no", cBean.bl_sequence_no.c_str()); + ITKCALL(AOM_set_value_string(cLine, "bl_occ_zt2_DtoE", "DBOM转换")); + AOM_save(cLine); + //最后unlock + AOM_unlock(cLine); + AOM_refresh(cLine, FALSE); + } + else { + printf("eeeeee\n"); + } + } + ITKCALL(BOM_save_window(ebom_window)); + } + BOM_close_window(ebom_window); + for (int i = 0; i < childs.size(); i++) { + NodeBean cBean = childs[i]; + createEbom(cBean, false, hasChange, saveAsMap); + } + } + else { + printf("topBean.mantr == NULLTAG\n"); + } + +} + +void copyEBomLine(tag_t matnrTop, tag_t otherPbom) { + tag_t ebom_window, ebom_window2, *bvr_list, *bvr_list2, bom_line, bom_line2, *c_line_tags, *c_line_tags2; + int bvr_count = 0, bvr_count2 = 0, c_line_count, c_line_count2; + (BOM_create_window(&ebom_window)); + (ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); + printf("bvr_count=%d \n", bvr_count); + if (bvr_count == 0) { + //errBuff.append("不存在EBOM请检查\n"); + } + ITKCALL(BOM_set_window_top_line_bvr(ebom_window, bvr_list[0], &bom_line)); //顶层bom获取 + printf("顶层bom获取\n"); + //ITKCALL(AOM_ask_value_tag(bom_line, "bl_line_object", &mantr)); + ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + + + (ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); + if (bvr_count2 == 0) { + tag_t newView, newViewBvr, pitem; + ITEM_ask_item_of_rev(otherPbom, &pitem); + ITKCALL(PS_create_bom_view(NULL, NULL, NULL, pitem, &newView)); + AOM_save(newView); + ITKCALL(PS_create_bvr(newView, NULL, NULL, FALSE, otherPbom, &newViewBvr)); + AOM_save(newViewBvr); + AOM_save(otherPbom); + int num = 0; + tag_t dsuser, *structure_revisions, *bom_view_tags, *mantrs; + ITKCALL(AOM_ask_value_tags(otherPbom, "TC_Is_Represented_By", &num, &mantrs)); + if (num == 1) { + AOM_ask_value_tag(mantrs[0], "owning_user", &dsuser); + tag_t defGroup; + ITKCALL(AOM_ask_value_tag(dsuser, "default_group", &defGroup)); + ITKCALL(AOM_set_ownership(newView, dsuser, defGroup)); + ITKCALL(AOM_set_ownership(newViewBvr, dsuser, defGroup)); + } + //return; + (ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); + } + (BOM_create_window(&ebom_window2)); + (BOM_set_window_top_line_bvr(ebom_window2, bvr_list2[0], &bom_line2)); //顶层bom获取 + ITKCALL(BOM_line_ask_all_child_lines(bom_line2, &c_line_count2, &c_line_tags2)); + for (int i = 0; i < c_line_count2; i++) { + BOM_line_cut(c_line_tags2[i]); + } + for (int i = 0; i < c_line_count; i++) { + tag_t newChild; char *bl_seqNo; + ITKCALL(BOM_line_copy(bom_line2, c_line_tags[i], NULLTAG, &newChild)); + AOM_ask_value_string(c_line_tags[i], "bl_sequence_no", &bl_seqNo); + AOM_lock(newChild); + AOM_set_value_string(newChild, "bl_sequence_no", bl_seqNo); + AOM_save(newChild); + //最后unlock + AOM_unlock(newChild); + } + //tag_t newChild; + //ITKCALL(BOM_line_copy(bom_line2, c_line_tags[i], NULLTAG, &newChild)); + + ITKCALL(BOM_save_window(ebom_window2)); + BOM_close_window(ebom_window2); + BOM_close_window(ebom_window); +} +//获取分类属性 判断是否整除 +int getClassValByTop(tag_t item, string& errMessage) { + char*id; + AOM_ask_value_string(item, "item_id", &id); + vector vec; + Split(id, "-", vec); + tag_t topItem; + if (vec.size() > 1) { + string topId; + topId.append("1ZDB300000P-").append(vec[1]); + ITEM_find_item(topId.c_str(), &topItem); + } + else { + return 1; + } + tag_t top_classificationObject; + ICS_ask_classification_object(topItem, &top_classificationObject); + if (top_classificationObject == NULL_TAG) + { + errMessage.append("顶层对象没有发送到分类\n"); + return 0; + } + char* top_class_id = NULL, *top_class_name = NULL; + //ICS_ask_class_of_classification_obj(top_classificationObject, &top_class_tag); + //ICS_ask_id_name(top_class_tag, &top_class_id, &top_class_name); + printf("BOM TOP LINE CLASS ID = %s | NAME = %s \n", top_class_id, top_class_name); + int n_attrs; + char** attr_names; + char** attr_vals; + ITKCALL(ICS_ask_attributes_of_classification_obj(top_classificationObject, &n_attrs, &attr_names, &attr_vals)); + cout << n_attrs << endl; + int num = 1; + for (int ii = 0; ii < n_attrs; ii++) + { + printf("attr_names[ii]==>%sTTT\n", attr_names[ii]); + printf("attr_vals[ii]==>%sTTT\n", attr_vals[ii]); + if (strcmp(attr_names[ii], "相数") == 0) { + if (strcmp(attr_vals[ii], "") == 0) { + errMessage.append("分类属性相数为空,请检查。\n"); + return 0; + } + else { + printf("111[ii]==TTT\n"); + if (strstr(attr_vals[ii], "3") != NULL) { + num = 3; + } + else if (strstr(attr_vals[ii], "1") != NULL) { + num = 1; + } + else if (strstr(attr_vals[ii], "5") != NULL) { + num = 5; + } + //num = atoi(attr_vals[ii]); + } + break; + } + } + return num; +} +/** + * DBOM转EBOM + */ +int DbomToEMethod(void* returnValue) { + int ifail = ITK_ok; + char *sql = NULL, *revUid; + tag_t designRev, item; + ITKCALL(ifail = USERARG_get_string_argument(&revUid)); + ITK__convert_uid_to_tag(revUid, &designRev); + ITEM_ask_item_of_rev(designRev, &item); + ITEM_ask_latest_rev(item, &designRev); + if (open("PLMUser", "PLMUser", "BDP2020", "10.128.20.35")) { + printf("链接SQLSERVER失败\n"); + } + else { + printf("链接SQLSERVER成功\n"); + } + //遍历design BOM 获取物料信息 + int bvr_count = 0, c_line_count; + tag_t ebom_window = NULLTAG; + tag_t bom_line = NULLTAG; + tag_t item_tag = NULLTAG, *c_line_tags; + (BOM_create_window(&ebom_window)); + tag_t* bvr_list = NULL; + (ITEM_rev_list_bom_view_revs(designRev, &bvr_count, &bvr_list)); + printf("bvr_count=%d", bvr_count); + + (BOM_set_window_top_line_bvr(ebom_window, bvr_list[0], &bom_line)); //顶层bom获取 + printf("顶层bom获取\n"); + + //(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + NodeBean topBean; + //遍历 + string errBuff; + //xsLen = 1; + xsLen = getClassValByTop(designRev, errBuff); + int url_num = 0; + char** url_vals = NULL; + PREF_ask_char_values("database_tc", &url_num, &url_vals); + string url = url_vals[0]; + url.append("/").append(url_vals[2]); + + //map %s \n", url.c_str()); + if (ConnServer(url_vals[3], url_vals[4], (char*)url.c_str()) == -1) + { + printf("提示:中间数据表访问失败\n"); + ifail = 1; + } + string dbName; + int url_num2 = 0; + char** url_vals2 = NULL; + PREF_ask_char_values("CHINT_MATERIAL_RAW", &url_num2, &url_vals2); + for (int t = 0; t < url_num2; t++) { + vector vec; + Split(url_vals2[t], ":", vec); + if (vec[0].compare("M060") == 0) { + dbName = vec[1]; + } + } + char *loginUserId; + printf("dbName===%s\n", dbName.c_str()); + POM_get_user_id(&loginUserId); + + recyReadBom(bom_line, topBean, errBuff, dbName, loginUserId); + DisConnServer(); + BOM_close_window(ebom_window); + //搭建BOM + POM_AM__set_application_bypass(true); + printf("error %s \n", errBuff.c_str()); + if (errBuff.empty()) { + string hasChange = ""; + map saveAsMap; + createEbom(topBean, true, hasChange, saveAsMap); + printf("topBean.ccps.size()====>%d\n", topBean.ccps.size()); + //没有更改直接跳过 + if (topBean.ccps.size() > 0 && hasChange.compare("no") != 0) { + tag_t desBean = topBean.designRev; + //vector childs = topBean.childs; + /*map dMap; + for (int i = 0; i < childs.size(); i++) { + NodeBean cBean = childs[i]; + char *matnrNo, *uid; + AOM_ask_value_string(cBean.mantr, "zt2_MaterialNo", &matnrNo); + ITK__convert_tag_to_uid(cBean.mantr, &uid); + printf("uid[%s]\n", uid); + printf("matnrNo[%s]\n", matnrNo); + int qtyPXn = 1; + string cnt = cBean.bl_quantity; + if (strcmp(cnt.c_str(), "") != 0) { + qtyPXn = atoi(cnt.c_str()); + } + if (dMap.count(matnrNo) > 0) { + dMap[matnrNo] = dMap[matnrNo] + qtyPXn; + } + else { + dMap[matnrNo] = qtyPXn; + } + } + printf("dMap[%d]", dMap.size());*/ + map dMap = getDBomMesg(topBean); + for (int t = 0; t < topBean.ccps.size(); t++) { + tag_t mantr = topBean.ccps[t]; + boolean flagChange = true; + bool flag = false; + map eMap = getBomMsg(mantr, flag); + printf("eMap[%d]", eMap.size()); + boolean needAs = false; + if (dMap.size() != eMap.size()) { + //升版 + 发布 + needAs = true; + } + else if (combEAndDbom(dMap, eMap)) { + //升版 + 发布 + needAs = true; + } + if (needAs && !flag) { + printf("=======TEST======\n"); + //升版并发布 + ITKCALL(ITEM_copy_rev(mantr, NULL, &mantr)); + TCMAndOwner(mantr); + //return; + } + if (flagChange) { + tag_t topItem, topRev; + ITEM_ask_item_of_rev(topBean.mantr, &topItem); + ITEM_ask_latest_rev(topItem, &topRev); + copyEBomLine(topRev, mantr); + } + } + } + errBuff = "succ"; + } + /*else { + printf(errBuff.c_str()); + }*/ + + POM_AM__set_application_bypass(false); + + close(); + printf("释放数据库成功\n"); + printf("子line数量 %d \n", topBean.childs.size()); + string buff = errBuff; + *((char**)returnValue) = (char*)MEM_alloc((strlen(buff.c_str()) + 1) * sizeof(char)); + tc_strcpy(*((char**)returnValue), buff.c_str()); + return ifail; +} +/** + * DBOM转EBOM 传递框架BOM之后使用 + * 区别在于需要通过首选项进行D转E,没有配置的不转换 + */ +int DbomToEMethodUser(void* returnValue) { + int ifail = ITK_ok; + char *sql = NULL, *revUid; + tag_t designRev; + ITKCALL(ifail = USERARG_get_string_argument(&revUid)); + ITK__convert_uid_to_tag(revUid, &designRev); + + if (open("PLMUser", "PLMUser", "BDP2020", "10.128.20.35")) { + printf("链接SQLSERVER失败\n"); + } + else { + printf("链接SQLSERVER成功\n"); + } + //遍历design BOM 获取物料信息 + int bvr_count = 0, c_line_count; + tag_t ebom_window = NULLTAG; + tag_t bom_line = NULLTAG; + tag_t item_tag = NULLTAG, *c_line_tags; + (BOM_create_window(&ebom_window)); + tag_t* bvr_list = NULL; + (ITEM_rev_list_bom_view_revs(designRev, &bvr_count, &bvr_list)); + printf("bvr_count=%d", bvr_count); + + (BOM_set_window_top_line_bvr(ebom_window, bvr_list[0], &bom_line)); //顶层bom获取 + printf("顶层bom获取\n"); + + //(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); + NodeBean topBean; + //遍历 + string errBuff; + + int url_num = 0; + char** url_vals = NULL; + PREF_ask_char_values("database_tc", &url_num, &url_vals); + string url = url_vals[0]; + url.append("/").append(url_vals[2]); + + //map %s \n", url.c_str()); + if (ConnServer(url_vals[3], url_vals[4], (char*)url.c_str()) == -1) + { + printf("提示:中间数据表访问失败\n"); + ifail = 1; + } + string dbName; + int url_num2 = 0, url_num3 = 0; + char** url_vals2 = NULL, **url_vals3 = NULL; + PREF_ask_char_values("CHINT_MATERIAL_RAW", &url_num2, &url_vals2); + for (int t = 0; t < url_num2; t++) { + vector vec; + Split(url_vals2[t], ":", vec); + if (vec[0].compare("M060") == 0) { + dbName = vec[1]; + } + } + //配置哪些ID类别需要D转E + PREF_ask_char_values("CHINT_M060_KJTOSAP", &url_num3, &url_vals3); + vector idVector; + if (url_num3 > 0) { + Split(url_vals3[0], ";", idVector); + } + + recyReadBom(bom_line, topBean, errBuff, dbName, idVector); + DisConnServer(); + BOM_close_window(ebom_window); + //搭建BOM + POM_AM__set_application_bypass(true); + printf("error %s \n", errBuff.c_str()); + //没有错误信息开始DBOM转换EBOM + if (errBuff.empty()) { + string change; + //EBOM的搭建 + map saveAsMap; + createEbom(topBean, false, change, saveAsMap); + printf("topBean.ccps.size()====>%d\n", topBean.ccps.size()); + if (topBean.ccps.size() > 0) { + //总装图下可能会有多个物料,BOM结构相同,只需要复制就行 + for (int t = 0; t < topBean.ccps.size(); t++) { + copyEBomLine(topBean.mantr, topBean.ccps[t]); + } + } + errBuff = "succ"; + } + + POM_AM__set_application_bypass(false); + + close(); + printf("释放数据库成功\n"); + printf("子line数量 %d \n", topBean.childs.size()); + string buff = errBuff; + *((char**)returnValue) = (char*)MEM_alloc((strlen(buff.c_str()) + 1) * sizeof(char)); + tc_strcpy(*((char**)returnValue), buff.c_str()); + return ifail; +} \ No newline at end of file diff --git a/General/General/DtoEBOM2.cpp b/General/General/DtoEBOM2.cpp index 70362f2..e5f45f5 100644 --- a/General/General/DtoEBOM2.cpp +++ b/General/General/DtoEBOM2.cpp @@ -122,9 +122,7 @@ tag_t getSapPart(tag_t designRevLine, tag_t designRev, string& errBuff, NodeBean return designRev; } ITKCALL(AOM_ask_value_tags(designRev, "representation_for", &num, &mantrs)); - - //新增逻辑 获取图纸下最新版本的E物料对象 会存在多个版本的 - + //printf("num===>%d\n", num); vector parts; if (strstr(item_id, "1ZDB300000P") != NULL) { map partsCcp; @@ -137,6 +135,14 @@ tag_t getSapPart(tag_t designRevLine, tag_t designRev, string& errBuff, NodeBean tag_t matnrItem; ITEM_ask_item_of_rev(mantrs[i], &matnrItem); partsCcp[itemId] = matnrItem; + //partsCcp.push_back(); + /*if (parts.size()==0) { + parts.push_back(mantrs[i]); + } + else { + printf("===========\n"); + bean.ccps.push_back(mantrs[i]); + }*/ } } map::iterator it; @@ -171,38 +177,27 @@ tag_t getSapPart(tag_t designRevLine, tag_t designRev, string& errBuff, NodeBean string s = it->first; tag_t partLast = partsCcp[s], partRevLast; ITEM_ask_latest_rev(partLast, &partRevLast); - if (parts.size() == 0) { - parts.push_back(partRevLast); - } + //if (parts.size() == 0) { + //} + parts.push_back(partRevLast); } - //for (int i = 0; i < num; i++) { - // char* type, *zt2_ifpbom; - // AOM_ask_value_string(mantrs[i], "object_type", &type); - // AOM_ask_value_string(mantrs[i], "zt2_ifpbom", &zt2_ifpbom); - // if (strstr(type, "Part") != NULL && strcmp(zt2_ifpbom, "P") != 0) { // - // tag_t matnrItem, partRevLast; - // ITEM_ask_item_of_rev(mantrs[i], &matnrItem); - // ITEM_ask_latest_rev(matnrItem, &partRevLast); - // parts.push_back(partRevLast); - // } - //} } if (parts.size() == 1) { return parts[0]; } string searchId; char* id, *zt2_TYJNo, *spec, *zt2_Diagram; - AOM_ask_value_string(designRev, "zt2_Diagram", &zt2_Diagram); - AOM_ask_value_string(designRev, "item_id", &id); + ITKCALL(AOM_ask_value_string(designRev, "zt2_Diagram", &zt2_Diagram)); + ITKCALL(AOM_ask_value_string(designRev, "item_id", &id)); //AOM_ask_value_string(designRev, "zt2_DrawingNo", &zt2_DrawingNo); /*if (strcmp(zt2_DrawingNo,"") != 0 && strcmp(zt2_DrawingNo, id) != 0) { - searchId = zt2_DrawingNo; + searchId = zt2_DrawingNo; } else {*/ searchId = id; //} - AOM_ask_value_string(designRevLine, "ZT2_TYSpecifications", &zt2_TYJNo); - AOM_ask_value_string(designRev, "zt2_Specifications", &spec); + ITKCALL(AOM_ask_value_string(designRevLine, "ZT2_TYSpecifications", &zt2_TYJNo)); + ITKCALL(AOM_ask_value_string(designRev, "zt2_Specifications", &spec)); if (strcmp(zt2_TYJNo, "") != 0) { string qryVal; tag_t query = NULLTAG, *tags; @@ -218,7 +213,7 @@ tag_t getSapPart(tag_t designRevLine, tag_t designRev, string& errBuff, NodeBean tag_t rev = tags[t]; if (isTcm(rev)) { char* zt2_MaterialNo; - AOM_ask_value_string(rev, "zt2_MaterialNo", &zt2_MaterialNo); + ITKCALL(AOM_ask_value_string(rev, "zt2_MaterialNo", &zt2_MaterialNo)); map_revs[zt2_MaterialNo] = rev; } } @@ -270,7 +265,7 @@ tag_t getSapPart(tag_t designRevLine, tag_t designRev, string& errBuff, NodeBean } /*String spec2 = parts.get(i).getProperty("zt2_Specifications"); if (spec.equals(spec2)) { - return parts.get(i); + return parts.get(i); }*/ } if (!strcmp(zt2_Diagram, "Y") == 0 && !strcmp(zt2_Diagram, "是") == 0) { @@ -286,18 +281,18 @@ tag_t getSapPart(tag_t designRevLine, tag_t designRev, string& errBuff, NodeBean return NULLTAG; /*else{ - return NULLTAG; + return NULLTAG; }*/ } /** - * 遍历DBOM - * @param bom_line DBOM的父级 - * @param bean 记录BOM结构 - * @param errBuff 记录错误信息 - * @param designRev 图纸版本 - * @param flagMat 是否外购 - */ +* 遍历DBOM +* @param bom_line DBOM的父级 +* @param bean 记录BOM结构 +* @param errBuff 记录错误信息 +* @param designRev 图纸版本 +* @param flagMat 是否外购 +*/ void askLineVal(NodeBean& bean, tag_t bom_line, tag_t designRev, string& errBuff, boolean &flagMat) { char* bl_quantity, *bl_plmxml_occ_xform, *bl_sequence_no, *sffc; ITKCALL(AOM_ask_value_string(bom_line, "bl_sequence_no", &bl_sequence_no)); @@ -404,12 +399,12 @@ void askLineVal(NodeBean& bean, tag_t bom_line, tag_t designRev, string& errBuff } } /** - * 获取通用件重量 - * @param bom_line DBOM - * @param materialutilization 材料利用率 - * @param errMessage 记录错误信息 - * @param desginRev 图纸版本 - */ +* 获取通用件重量 +* @param bom_line DBOM +* @param materialutilization 材料利用率 +* @param errMessage 记录错误信息 +* @param desginRev 图纸版本 +*/ string getTyjZl(tag_t bom_line, string materialutilization, tag_t desginRev, string &errMessage) { char *ZT2_TYSpecifications, *ZT2_TYWeight, *item_id; AOM_ask_value_string(bom_line, "item_id", &item_id); @@ -476,13 +471,13 @@ void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, string& errBuff, string dbName, NodeBean& pBean, int qtyXn, vector idVector); /** - * 遍历DBOM - * @param bom_line DBOM的父级 - * @param pBean 记录BOM结构 - * @param errBuff 记录错误信息 - * @param dbName 原材料展开数据库信息 - * @param loginUserId 用户信息 - */ +* 遍历DBOM +* @param bom_line DBOM的父级 +* @param pBean 记录BOM结构 +* @param errBuff 记录错误信息 +* @param dbName 原材料展开数据库信息 +* @param loginUserId 用户信息 +*/ void recyReadBom(tag_t bom_line, NodeBean& pBean, string& errBuff, string dbName, char *loginUserId) { int c_line_count; @@ -686,13 +681,13 @@ void recyReadBom(tag_t bom_line, NodeBean& pBean, string& errBuff, string dbName getAllXnj(xnzjbVec, maxNum, xxt, errBuff, dbName, pBean, 1, loginUserId); } /** - * DBOM转EBOM框架BOM使用 - * @param bom_line DBOM顶层 - * @param pBean 记录EBOM结构 - * @param errBuff 记录错误信息 - * @param dbName 原材料展开的数据表 - * @param idVector 需要D转E的BOM类别 - */ +* DBOM转EBOM框架BOM使用 +* @param bom_line DBOM顶层 +* @param pBean 记录EBOM结构 +* @param errBuff 记录错误信息 +* @param dbName 原材料展开的数据表 +* @param idVector 需要D转E的BOM类别 +*/ void recyReadBom(tag_t bom_line, NodeBean& pBean, string& errBuff, string dbName, vector idVector) { int c_line_count; @@ -875,15 +870,15 @@ void recyReadBom(tag_t bom_line, NodeBean& pBean, string& errBuff, string dbName getAllXnj(xnzjbVec, maxNum, xxt, errBuff, dbName, pBean, 1, idVector); } /** - * 提取虚拟装配件 - * @param xnzjbVec 虚拟装配件版本集合 - * @param maxNum 提取之后的查找编号 - * @param xxt 查找编号累加的 - * @param errBuff 错误信息 - * @param dbName 原材料展开数据表 - * @param qtyXn 提取时需要累乘数量 - * @param idVector 需要展开的ID类别 - */ +* 提取虚拟装配件 +* @param xnzjbVec 虚拟装配件版本集合 +* @param maxNum 提取之后的查找编号 +* @param xxt 查找编号累加的 +* @param errBuff 错误信息 +* @param dbName 原材料展开数据表 +* @param qtyXn 提取时需要累乘数量 +* @param idVector 需要展开的ID类别 +*/ void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, string& errBuff, string dbName, NodeBean& pBean, int qtyXn, vector idVector) { @@ -942,15 +937,15 @@ void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, } } /** - * 提取虚拟装配件 - * @param xnzjbVec 虚拟装配件版本集合 - * @param maxNum 提取之后的查找编号 - * @param xxt 查找编号累加的 - * @param errBuff 错误信息 - * @param dbName 原材料展开数据表 - * @param qtyXn 提取时需要累乘数量 - * @param loginUserId 用户ID - */ +* 提取虚拟装配件 +* @param xnzjbVec 虚拟装配件版本集合 +* @param maxNum 提取之后的查找编号 +* @param xxt 查找编号累加的 +* @param errBuff 错误信息 +* @param dbName 原材料展开数据表 +* @param qtyXn 提取时需要累乘数量 +* @param loginUserId 用户ID +*/ void getAllXnj(vector xnzjbVec, int maxNum, int &xxt, string& errBuff, string dbName, NodeBean& pBean, int qtyXn, char *loginUserId) { @@ -1061,19 +1056,19 @@ boolean firstRevision(tag_t designRev, tag_t mantr) { } } /** - * 获取单层DBOM的信息 跟EBOM比较用的 - * @param topBean 记录的BOM结构 - */ +* 获取单层DBOM的信息 跟EBOM比较用的 +* @param topBean 记录的BOM结构 +*/ map getDBomMesg(NodeBean topBean) { + printf("getDBomMesg\n"); vector childs = topBean.childs; map dMap; for (int i = 0; i < childs.size(); i++) { NodeBean cBean = childs[i]; char *matnrNo, *uid; - AOM_ask_value_string(cBean.mantr, MATERIALNO, &matnrNo); + ITKCALL(AOM_ask_value_string(cBean.mantr, MATERIALNO, &matnrNo)); ITK__convert_tag_to_uid(cBean.mantr, &uid); - printf("uid[%s]\n", uid); - printf("matnrNo[%s]\n", matnrNo); + printf("uid[%s]matnrNo[%s]\n", uid, matnrNo); int qtyPXn = 1; string cnt = cBean.bl_quantity; if (strcmp(cnt.c_str(), "") != 0) { @@ -1089,11 +1084,12 @@ map getDBomMesg(NodeBean topBean) { return dMap; } /** - * 获取单层EBOM的信息 跟DBOM比较用的 - * @param mantrRev E物料 - * @param flag 记录有没有bom视图 - */ +* 获取单层EBOM的信息 跟DBOM比较用的 +* @param mantrRev E物料 +* @param flag 记录有没有bom视图 +*/ map getBomMsg(tag_t mantrRev, bool& flag) { + printf("getBomMsg\n"); map bomMsgMap; tag_t* bvr_list = NULL, bom_line, ebom_window; int bvr_count = 0; @@ -1114,10 +1110,10 @@ map getBomMsg(tag_t mantrRev, bool& flag) { tag_t c_Rev; char *matnrNo, *cnt; ITKCALL(AOM_ask_value_tag(c_line_tags[t], "bl_line_object", &c_Rev)); - AOM_ask_value_string(c_Rev, "zt2_MaterialNo", &matnrNo); + ITKCALL(AOM_ask_value_string(c_Rev, "zt2_MaterialNo", &matnrNo)); printf("zt2_MaterialNo===>%s\n", matnrNo); int qtyPXn = 1; - AOM_ask_value_string(c_line_tags[t], "bl_quantity", &cnt); + ITKCALL(AOM_ask_value_string(c_line_tags[t], "bl_quantity", &cnt)); if (strcmp(cnt, "") != 0) { qtyPXn = atoi(cnt); } @@ -1128,14 +1124,14 @@ map getBomMsg(tag_t mantrRev, bool& flag) { bomMsgMap[matnrNo] = qtyPXn; } } - BOM_close_window(ebom_window); + ITKCALL(BOM_close_window(ebom_window)); return bomMsgMap; } /** - * 对比Ebom和Dbom - * @param dMap D物料编码 - 数量 - * @param eMap E物料编码 - 数量 - */ +* 对比Ebom和Dbom +* @param dMap D物料编码 - 数量 +* @param eMap E物料编码 - 数量 +*/ boolean combEAndDbom(map dMap, map eMap) { map::iterator it; //名称模糊匹配 @@ -1152,18 +1148,18 @@ boolean combEAndDbom(map dMap, map eMap) { return false; } /** - * 发布并且修改所有权 - */ +* 发布并且修改所有权 +*/ void TCMAndOwner(tag_t matnrTop) { int num = 0, revNum; tag_t *mantrsAs, dsuser, *structure_revisions; - AOM_ask_value_tags(matnrTop, "TC_Is_Represented_By", &num, &mantrsAs); - AOM_ask_value_tag(mantrsAs[0], "owning_user", &dsuser); + ITKCALL(AOM_ask_value_tags(matnrTop, "TC_Is_Represented_By", &num, &mantrsAs)); + ITKCALL(AOM_ask_value_tag(mantrsAs[0], "owning_user", &dsuser)); tag_t defGroup; ITKCALL(AOM_ask_value_tag(dsuser, "default_group", &defGroup)); ITKCALL(AOM_set_ownership(matnrTop, dsuser, defGroup)); if (num > 0) { - AOM_ask_value_tags(matnrTop, "structure_revisions", &revNum, &structure_revisions); + ITKCALL(AOM_ask_value_tags(matnrTop, "structure_revisions", &revNum, &structure_revisions)); if (revNum > 0) { ITKCALL(AOM_set_ownership(structure_revisions[0], dsuser, defGroup)); } @@ -1172,16 +1168,17 @@ void TCMAndOwner(tag_t matnrTop) { proProcessCreate(matnrTop, process_name);*/ } /** - * 比较DBOM、EBOM是否相同,不同则升版 - * @param topBean 存放BOM信息 - * @param isTop 是否产成品 - * @param hasChange 是否发布 - * @param saveAsMap 存放升版之前的版本uid - 升版之后的新版本 存在打包的对象防止多次升版 - */ +* 比较DBOM、EBOM是否相同,不同则升版 +* @param topBean 存放BOM信息 +* @param isTop 是否产成品 +* @param hasChange 是否发布 +* @param saveAsMap 存放升版之前的版本uid - 升版之后的新版本 存在打包的对象防止多次升版 +*/ tag_t saveAsMaterial(NodeBean topBean, boolean isTop, string &hasChange, map& saveAsMap) { tag_t mantr = topBean.mantr;//升版之前的E物料 char* oldUid; ITK__convert_tag_to_uid(mantr, &oldUid); + printf("saveAsMaterial:%s\n", oldUid); if (saveAsMap.count(oldUid) > 0) { return saveAsMap[oldUid]; } @@ -1191,8 +1188,8 @@ tag_t saveAsMaterial(NodeBean topBean, boolean isTop, string &hasChange, map& saveAsMap) +string createEbom(NodeBean topBean, boolean isTop, string &hasChange, map& saveAsMap) { - tag_t ebom_window = NULLTAG; + printf("createEbom start\n"); + string errMsg = ""; tag_t bom_line = NULLTAG; vector childs = topBean.childs; //printf("子line数量 %d \n", childs.size()); - tag_t desBean = topBean.designRev; - char* id; - AOM_ask_value_string(desBean, "item_id", &id); - printf("id %s \n", id); tag_t mantr = topBean.mantr; //判断是否最初版本 不是就和当前的EBOM进行比较 //相同就跳过不升版、不同就升版、只比较数量 @@ -1234,42 +1229,62 @@ void createEbom(NodeBean topBean, boolean isTop, string &hasChange, map 0) { - printf("-----"); + char* id = NULL, * object_string = NULL; + ITKCALL(AOM_ask_value_string(mantr, "object_string", &object_string)); + printf("createEbom:%s\n", object_string); + tag_t desBean = topBean.designRev; + ITKCALL(AOM_ask_value_string(desBean, "item_id", &id)); + printf("designRev:%s \n", id); tag_t* bvr_list = NULL; int bvr_count; ITKCALL(ITEM_rev_list_bom_view_revs(mantr, &bvr_count, &bvr_list)); //没有BOM视图创建 if (bvr_count == 0) { tag_t newView, newViewBvr, pitem, dsuser; - ITEM_ask_item_of_rev(mantr, &pitem); + ITKCALL(ITEM_ask_item_of_rev(mantr, &pitem)); ITKCALL(PS_create_bom_view(NULL, NULL, NULL, pitem, &newView)); - AOM_save(newView); + ITKCALL(AOM_save(newView)); ITKCALL(PS_create_bvr(newView, NULL, NULL, FALSE, mantr, &newViewBvr)); - AOM_save(newViewBvr); - AOM_save(mantr); - AOM_ask_value_tag(desBean, "owning_user", &dsuser); + ITKCALL(AOM_save(newViewBvr)); + ITKCALL(AOM_save(mantr)); + ITKCALL(AOM_ask_value_tag(desBean, "owning_user", &dsuser)); tag_t defGroup; ITKCALL(AOM_ask_value_tag(dsuser, "default_group", &defGroup)); ITKCALL(AOM_set_ownership(newView, dsuser, defGroup)); ITKCALL(AOM_set_ownership(newViewBvr, dsuser, defGroup)); } - ITKCALL(BOM_create_window(&ebom_window)); - //移除原来的 - char*topUidTest; - ITK__convert_tag_to_uid(mantr, &topUidTest); - printf("topUidTest =======> %s \n", topUidTest); - ITKCALL(BOM_set_window_top_line(ebom_window, NULL, mantr, NULLTAG, &bom_line)); //变更当前BOM层级 已发布的不需要更改 + if (bvr_count > 0) { + char* date_released = NULL; + ITKCALL(AOM_UIF_ask_value(bvr_list[0], "date_released", &date_released)); + //ITKCALL(AOM_ask_value_date(bvr_list[0], "date_released", &date_released)); + printf("bvr_list%d:%s \n", bvr_count, date_released); + if (date_released && tc_strlen(date_released) > 0) { + flagChange = false; + char* released = NULL; + ITKCALL(AOM_UIF_ask_value(mantr, "date_released", &released)); + printf("released:%s \n", released); + if (!released || tc_strlen(released) == 0) { + errMsg.append(object_string).append(","); + printf("errMsg:%s \n", errMsg.c_str()); + return errMsg; + } + } + } if (flagChange) { + tag_t ebom_window = NULLTAG; + ITKCALL(BOM_create_window(&ebom_window)); + //移除原来的 + ITKCALL(BOM_set_window_top_line(ebom_window, NULL, mantr, NULLTAG, &bom_line)); if (bvr_count > 0) { int c_line_count; tag_t* c_line_tags; ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); for (int t = 0; t < c_line_count; t++) { char* val; - AOM_ask_value_string(c_line_tags[t], "bl_occ_zt2_DtoE", &val); + ITKCALL(AOM_ask_value_string(c_line_tags[t], "bl_occ_zt2_DtoE", &val)); if (strcmp(val, "DBOM转换") == 0) { - BOM_line_cut(c_line_tags[t]); + ITKCALL(BOM_line_cut(c_line_tags[t])); } } } @@ -1277,50 +1292,60 @@ void createEbom(NodeBean topBean, boolean isTop, string &hasChange, map 0) { - string num = cBean.bl_quantity; - num = to_string(cBean.topNum / cBean.packNum); - ITKCALL(AOM_set_value_string(cLine, "bl_quantity", num.c_str())); + if (cLine != NULLTAG) { + ITKCALL(AOM_lock(cLine)); + if (cBean.packNum > 0) { + string num = cBean.bl_quantity; + num = to_string(cBean.topNum / cBean.packNum); + ITKCALL(AOM_set_value_string(cLine, "bl_quantity", num.c_str())); + } + else { + printf("num %s \n", cBean.bl_quantity.c_str()); + ITKCALL(AOM_set_value_string(cLine, "bl_quantity", cBean.bl_quantity.c_str())); + } + + + ITKCALL(AOM_set_value_string(cLine, "bl_plmxml_occ_xform", cBean.bl_plmxml_occ_xform)); + ITKCALL(AOM_set_value_string(cLine, "bl_sequence_no", cBean.bl_sequence_no.c_str())); + ITKCALL(AOM_set_value_string(cLine, "bl_occ_zt2_DtoE", "DBOM转换")); + ITKCALL(AOM_save(cLine)); + //最后unlock + ITKCALL(AOM_unlock(cLine)); + ITKCALL(AOM_refresh(cLine, FALSE)); } else { - printf("num %s \n", cBean.bl_quantity.c_str()); - ITKCALL(AOM_set_value_string(cLine, "bl_quantity", cBean.bl_quantity.c_str())); + printf("搭建BOM失败!\n"); } - - - AOM_set_value_string(cLine, "bl_plmxml_occ_xform", cBean.bl_plmxml_occ_xform); - AOM_set_value_string(cLine, "bl_sequence_no", cBean.bl_sequence_no.c_str()); - ITKCALL(AOM_set_value_string(cLine, "bl_occ_zt2_DtoE", "DBOM转换")); - AOM_save(cLine); - //最后unlock - AOM_unlock(cLine); - AOM_refresh(cLine, FALSE); } else { printf("eeeeee\n"); } } ITKCALL(BOM_save_window(ebom_window)); + ITKCALL(BOM_close_window(ebom_window)); } - BOM_close_window(ebom_window); + printf("eeeeee2\n"); for (int i = 0; i < childs.size(); i++) { NodeBean cBean = childs[i]; - createEbom(cBean, false, hasChange, saveAsMap); + errMsg.append(createEbom(cBean, false, hasChange, saveAsMap)); } } else { printf("topBean.mantr == NULLTAG\n"); } - + printf("eeerrMsg:%s\n", errMsg.c_str()); + return errMsg; } void copyEBomLine(tag_t matnrTop, tag_t otherPbom) { tag_t ebom_window, ebom_window2, *bvr_list, *bvr_list2, bom_line, bom_line2, *c_line_tags, *c_line_tags2; int bvr_count = 0, bvr_count2 = 0, c_line_count, c_line_count2; - (BOM_create_window(&ebom_window)); - (ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); + ITKCALL(BOM_create_window(&ebom_window)); + ITKCALL(ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); printf("bvr_count=%d \n", bvr_count); if (bvr_count == 0) { //errBuff.append("不存在EBOM请检查\n"); @@ -1331,50 +1356,50 @@ void copyEBomLine(tag_t matnrTop, tag_t otherPbom) { ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); - (ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); + ITKCALL(ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); if (bvr_count2 == 0) { tag_t newView, newViewBvr, pitem; - ITEM_ask_item_of_rev(otherPbom, &pitem); + ITKCALL(ITEM_ask_item_of_rev(otherPbom, &pitem)); ITKCALL(PS_create_bom_view(NULL, NULL, NULL, pitem, &newView)); - AOM_save(newView); + ITKCALL(AOM_save(newView)); ITKCALL(PS_create_bvr(newView, NULL, NULL, FALSE, otherPbom, &newViewBvr)); - AOM_save(newViewBvr); - AOM_save(otherPbom); + ITKCALL(AOM_save(newViewBvr)); + ITKCALL(AOM_save(otherPbom)); int num = 0; tag_t dsuser, *structure_revisions, *bom_view_tags, *mantrs; ITKCALL(AOM_ask_value_tags(otherPbom, "TC_Is_Represented_By", &num, &mantrs)); if (num == 1) { - AOM_ask_value_tag(mantrs[0], "owning_user", &dsuser); + ITKCALL(AOM_ask_value_tag(mantrs[0], "owning_user", &dsuser)); tag_t defGroup; ITKCALL(AOM_ask_value_tag(dsuser, "default_group", &defGroup)); ITKCALL(AOM_set_ownership(newView, dsuser, defGroup)); ITKCALL(AOM_set_ownership(newViewBvr, dsuser, defGroup)); } //return; - (ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); + ITKCALL(ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); } - (BOM_create_window(&ebom_window2)); - (BOM_set_window_top_line_bvr(ebom_window2, bvr_list2[0], &bom_line2)); //顶层bom获取 + ITKCALL(BOM_create_window(&ebom_window2)); + ITKCALL(BOM_set_window_top_line_bvr(ebom_window2, bvr_list2[0], &bom_line2)); //顶层bom获取 ITKCALL(BOM_line_ask_all_child_lines(bom_line2, &c_line_count2, &c_line_tags2)); for (int i = 0; i < c_line_count2; i++) { - BOM_line_cut(c_line_tags2[i]); + ITKCALL(BOM_line_cut(c_line_tags2[i])); } for (int i = 0; i < c_line_count; i++) { tag_t newChild; char *bl_seqNo; ITKCALL(BOM_line_copy(bom_line2, c_line_tags[i], NULLTAG, &newChild)); - AOM_ask_value_string(c_line_tags[i], "bl_sequence_no", &bl_seqNo); - AOM_lock(newChild); - AOM_set_value_string(newChild, "bl_sequence_no", bl_seqNo); - AOM_save(newChild); + ITKCALL(AOM_ask_value_string(c_line_tags[i], "bl_sequence_no", &bl_seqNo)); + ITKCALL(AOM_lock(newChild)); + ITKCALL(AOM_set_value_string(newChild, "bl_sequence_no", bl_seqNo)); + ITKCALL(AOM_save(newChild)); //最后unlock - AOM_unlock(newChild); + ITKCALL(AOM_unlock(newChild)); } //tag_t newChild; //ITKCALL(BOM_line_copy(bom_line2, c_line_tags[i], NULLTAG, &newChild)); ITKCALL(BOM_save_window(ebom_window2)); - BOM_close_window(ebom_window2); - BOM_close_window(ebom_window); + ITKCALL(BOM_close_window(ebom_window2)); + ITKCALL(BOM_close_window(ebom_window)); } //获取分类属性 判断是否整除 int getClassValByTop(tag_t item, string& errMessage) { @@ -1436,16 +1461,16 @@ int getClassValByTop(tag_t item, string& errMessage) { return num; } /** - * DBOM转EBOM - */ +* DBOM转EBOM +*/ int DbomToEMethod(void* returnValue) { int ifail = ITK_ok; char *sql = NULL, *revUid; tag_t designRev, item; ITKCALL(ifail = USERARG_get_string_argument(&revUid)); ITK__convert_uid_to_tag(revUid, &designRev); - ITEM_ask_item_of_rev(designRev, &item); - ITEM_ask_latest_rev(item, &designRev); + ITKCALL(ITEM_ask_item_of_rev(designRev, &item)); + ITKCALL(ITEM_ask_latest_rev(item, &designRev)); if (open("PLMUser", "PLMUser", "BDP2020", "10.128.20.35")) { printf("链接SQLSERVER失败\n"); } @@ -1457,12 +1482,12 @@ int DbomToEMethod(void* returnValue) { tag_t ebom_window = NULLTAG; tag_t bom_line = NULLTAG; tag_t item_tag = NULLTAG, *c_line_tags; - (BOM_create_window(&ebom_window)); + ITKCALL(BOM_create_window(&ebom_window)); tag_t* bvr_list = NULL; - (ITEM_rev_list_bom_view_revs(designRev, &bvr_count, &bvr_list)); + ITKCALL(ITEM_rev_list_bom_view_revs(designRev, &bvr_count, &bvr_list)); printf("bvr_count=%d", bvr_count); - (BOM_set_window_top_line_bvr(ebom_window, bvr_list[0], &bom_line)); //顶层bom获取 + ITKCALL(BOM_set_window_top_line_bvr(ebom_window, bvr_list[0], &bom_line)); //顶层bom获取 printf("顶层bom获取\n"); //(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); @@ -1473,7 +1498,7 @@ int DbomToEMethod(void* returnValue) { xsLen = getClassValByTop(designRev, errBuff); int url_num = 0; char** url_vals = NULL; - PREF_ask_char_values("database_tc", &url_num, &url_vals); + ITKCALL(PREF_ask_char_values("database_tc", &url_num, &url_vals)); string url = url_vals[0]; url.append("/").append(url_vals[2]); @@ -1487,7 +1512,7 @@ int DbomToEMethod(void* returnValue) { string dbName; int url_num2 = 0; char** url_vals2 = NULL; - PREF_ask_char_values("CHINT_MATERIAL_RAW", &url_num2, &url_vals2); + ITKCALL(PREF_ask_char_values("CHINT_MATERIAL_RAW", &url_num2, &url_vals2)); for (int t = 0; t < url_num2; t++) { vector vec; Split(url_vals2[t], ":", vec); @@ -1497,18 +1522,26 @@ int DbomToEMethod(void* returnValue) { } char *loginUserId; printf("dbName===%s\n", dbName.c_str()); - POM_get_user_id(&loginUserId); - + ITKCALL(POM_get_user_id(&loginUserId)); + recyReadBom(bom_line, topBean, errBuff, dbName, loginUserId); DisConnServer(); - BOM_close_window(ebom_window); + ITKCALL(BOM_close_window(ebom_window)); //搭建BOM POM_AM__set_application_bypass(true); printf("error %s \n", errBuff.c_str()); if (errBuff.empty()) { string hasChange = ""; map saveAsMap; - createEbom(topBean, true, hasChange, saveAsMap); + string errMsg = createEbom(topBean, true, hasChange, saveAsMap); + printf("errMsg %s \n", errMsg.c_str()); + if (errMsg.size() > 0) { + errMsg.append("没有发布!"); + ifail = 109; + *((char**)returnValue) = (char*)MEM_alloc((strlen(errMsg.c_str()) + 1) * sizeof(char)); + tc_strcpy(*((char**)returnValue), errMsg.c_str()); + return ifail; + } printf("topBean.ccps.size()====>%d\n", topBean.ccps.size()); //没有更改直接跳过 if (topBean.ccps.size() > 0 && hasChange.compare("no") != 0) { @@ -1516,23 +1549,23 @@ int DbomToEMethod(void* returnValue) { //vector childs = topBean.childs; /*map dMap; for (int i = 0; i < childs.size(); i++) { - NodeBean cBean = childs[i]; - char *matnrNo, *uid; - AOM_ask_value_string(cBean.mantr, "zt2_MaterialNo", &matnrNo); - ITK__convert_tag_to_uid(cBean.mantr, &uid); - printf("uid[%s]\n", uid); - printf("matnrNo[%s]\n", matnrNo); - int qtyPXn = 1; - string cnt = cBean.bl_quantity; - if (strcmp(cnt.c_str(), "") != 0) { - qtyPXn = atoi(cnt.c_str()); - } - if (dMap.count(matnrNo) > 0) { - dMap[matnrNo] = dMap[matnrNo] + qtyPXn; - } - else { - dMap[matnrNo] = qtyPXn; - } + NodeBean cBean = childs[i]; + char *matnrNo, *uid; + AOM_ask_value_string(cBean.mantr, "zt2_MaterialNo", &matnrNo); + ITK__convert_tag_to_uid(cBean.mantr, &uid); + printf("uid[%s]\n", uid); + printf("matnrNo[%s]\n", matnrNo); + int qtyPXn = 1; + string cnt = cBean.bl_quantity; + if (strcmp(cnt.c_str(), "") != 0) { + qtyPXn = atoi(cnt.c_str()); + } + if (dMap.count(matnrNo) > 0) { + dMap[matnrNo] = dMap[matnrNo] + qtyPXn; + } + else { + dMap[matnrNo] = qtyPXn; + } } printf("dMap[%d]", dMap.size());*/ map dMap = getDBomMesg(topBean); @@ -1560,8 +1593,8 @@ int DbomToEMethod(void* returnValue) { } if (flagChange) { tag_t topItem, topRev; - ITEM_ask_item_of_rev(topBean.mantr, &topItem); - ITEM_ask_latest_rev(topItem, &topRev); + ITKCALL(ITEM_ask_item_of_rev(topBean.mantr, &topItem)); + ITKCALL(ITEM_ask_latest_rev(topItem, &topRev)); copyEBomLine(topRev, mantr); } } @@ -1569,7 +1602,7 @@ int DbomToEMethod(void* returnValue) { errBuff = "succ"; } /*else { - printf(errBuff.c_str()); + printf(errBuff.c_str()); }*/ POM_AM__set_application_bypass(false); @@ -1583,9 +1616,9 @@ int DbomToEMethod(void* returnValue) { return ifail; } /** - * DBOM转EBOM 传递框架BOM之后使用 - * 区别在于需要通过首选项进行D转E,没有配置的不转换 - */ +* DBOM转EBOM 传递框架BOM之后使用 +* 区别在于需要通过首选项进行D转E,没有配置的不转换 +*/ int DbomToEMethodUser(void* returnValue) { int ifail = ITK_ok; char *sql = NULL, *revUid; diff --git a/General/General/EbomToPMethod.cpp b/General/General/EbomToPMethod.cpp index 605ee20..0823f4b 100644 --- a/General/General/EbomToPMethod.cpp +++ b/General/General/EbomToPMethod.cpp @@ -655,7 +655,7 @@ void replaceBom(EBomBean& childPm, map& map, int len, tag_t dcpro string url = "http://10.128.20.35:9002/Post/PLM_Goods"; string jsonUf = G2U222(jsons[i].c_str()); //调用接口申请物料 - //string msg = callHttpserver(jsonUf, url); + string msg = callHttpserver(jsonUf, url); } } } @@ -770,7 +770,7 @@ void recyReadEBom(tag_t pLine, EBomBean parentBean, vector& beans, int int num = 0; tag_t* mantrs; ITKCALL(AOM_ask_value_tags(eRev, "TC_Is_Represented_By", &num, &mantrs)); - if (num == 1) { + if (num > 0) { char* id; AOM_ask_value_string(mantrs[0], "item_id", &id); string item_id = id; @@ -870,8 +870,9 @@ class E2PBean // public: string key;//wbs号+物料号组成的标识 tag_t pMantr=NULLTAG; // p物料 发布升版,没发布更新,取最新版本 (不带P的移除添加) - string revId = ""; + string prevId = ""; tag_t eMantr; // e物料 + string erevId = ""; public: //定义成员函数 void isSameKey(string newKey) @@ -901,9 +902,9 @@ void updatePbomCycle(tag_t eLine, string &errBuff, int len, EBomUpBean &upBean) char* ifpBom, *matnrNo, *childQty; tag_t c_line_tag = c_line_tags[i], eRev; ITKCALL(AOM_ask_value_tag(c_line_tag, "bl_line_object", &eRev)); - AOM_ask_value_string(c_line_tag, BL_QUANTITY, &childQty); - AOM_ask_value_string(eRev, "zt2_ifpbom", &ifpBom); - AOM_ask_value_string(eRev, "zt2_MaterialNo", &matnrNo); + ITKCALL(AOM_ask_value_string(c_line_tag, BL_QUANTITY, &childQty)); + ITKCALL(AOM_ask_value_string(eRev, "zt2_ifpbom", &ifpBom)); + ITKCALL(AOM_ask_value_string(eRev, "zt2_MaterialNo", &matnrNo)); EBomUpBean cBean; cBean.matnrNo = matnrNo; @@ -916,30 +917,30 @@ void updatePbomCycle(tag_t eLine, string &errBuff, int len, EBomUpBean &upBean) ITKCALL(AOM_ask_value_tags(eRev, "TC_Is_Represented_By", &num, &mantrs)); if (num == 1) { char* id; - AOM_ask_value_string(mantrs[0], "item_id", &id); + ITKCALL(AOM_ask_value_string(mantrs[0], "item_id", &id)); string item_id = id; smatch result; bool ret = regex_match(item_id, result, qq_reg); if (ret) { char* zt2_ifpbom; - AOM_ask_value_string(eRev, "zt2_ifpbom", &zt2_ifpbom); + ITKCALL(AOM_ask_value_string(eRev, "zt2_ifpbom", &zt2_ifpbom)); if (zt2_ifpbom != NULL && strcmp(zt2_ifpbom, "P") == 0) { continue; } int cc_cnt; tag_t* cc_lines; - BOM_line_ask_all_child_lines(c_line_tag, &cc_cnt, &cc_lines); + ITKCALL(BOM_line_ask_all_child_lines(c_line_tag, &cc_cnt, &cc_lines)); printf("cc_cnt===> %d item_id ==> %s \n", cc_cnt, id); //新增逻辑 for (int tt = 0; tt < cc_cnt; tt++) { tag_t cc_line = cc_lines[tt], c_eRev; char* bl_quantity, *pId, *c_pId,*bl_line_name,*remark; - AOM_ask_value_string(eRev, "item_id", &pId); - AOM_ask_value_string(cc_line, "bl_quantity", &bl_quantity); + ITKCALL(AOM_ask_value_string(eRev, "item_id", &pId)); + ITKCALL(AOM_ask_value_string(cc_line, "bl_quantity", &bl_quantity)); ITKCALL(AOM_ask_value_tag(cc_line, "bl_line_object", &c_eRev)); - AOM_ask_value_string(cc_line, "bl_line_name", &bl_line_name); - AOM_ask_value_string(c_eRev, "item_id", &c_pId); - AOM_ask_value_string(cc_line, "ZT2_Remark", &remark); + ITKCALL(AOM_ask_value_string(cc_line, "bl_line_name", &bl_line_name)); + ITKCALL(AOM_ask_value_string(c_eRev, "item_id", &c_pId)); + ITKCALL(AOM_ask_value_string(cc_line, "ZT2_Remark", &remark)); printf("c_pId===> %s bl_quantity ==> %s len==> %d \n", c_pId, bl_quantity, len); if (strcmp("bl_quantity", "") == 0) { errBuff.append("P类物料:").append(pId).append("下子件").append(c_pId) @@ -1195,7 +1196,7 @@ void createAXxq(tag_t eRev, tag_t pRev, int len, tag_t dcproxy) { printf("jsons ===> %s \n", jsons[i].c_str()); string url = "http://10.128.20.35:9002/Post/PLM_Goods"; string jsonUf = G2U222(jsons[i].c_str()); - //string msg = callHttpserver(jsonUf, url); + string msg = callHttpserver(jsonUf, url); } } } @@ -1205,27 +1206,28 @@ void addToAmatnrUp(vector vecs, int len, tag_t newPAmatnr, boolean l tag_t mantr = newPAmatnr, ebom_window, bom_line; tag_t* bvr_list = NULL; int bvr_count; + POM_AM__set_application_bypass(true); ITKCALL(ITEM_rev_list_bom_view_revs(mantr, &bvr_count, &bvr_list)); if (bvr_count == 0) { tag_t newView, newViewBvr, pitem; - ITEM_ask_item_of_rev(mantr, &pitem); + ITKCALL(ITEM_ask_item_of_rev(mantr, &pitem)); ITKCALL(PS_create_bom_view(NULL, NULL, NULL, pitem, &newView)); - AOM_save(newView); + ITKCALL(AOM_save(newView)); ITKCALL(PS_create_bvr(newView, NULL, NULL, FALSE, mantr, &newViewBvr)); - AOM_save(newViewBvr); - AOM_save(mantr); + ITKCALL(AOM_save(newViewBvr)); + ITKCALL(AOM_save(mantr)); } ITKCALL(BOM_create_window(&ebom_window)); ITKCALL(BOM_set_window_top_line(ebom_window, NULL, mantr, NULLTAG, &bom_line)); char *name; - AOM_ask_value_string(mantr, "object_name", &name); + ITKCALL(AOM_ask_value_string(mantr, "object_name", &name)); string xqType = getXqName(name); //ABCDE for (int i = 0; i < vecs.size(); i++) { - tag_t newChild; + tag_t newChild = NULLTAG; tag_t cline = vecs[i].bomline; char* oldQty, *seqNo, *remark,*bl_line_name; - AOM_ask_value_string(cline, "ZT2_Remark", &remark); + ITKCALL(AOM_ask_value_string(cline, "ZT2_Remark", &remark)); string msg = getRemarkMsg(remark, len); int xqLen = len; if (msg.length() > 0) { @@ -1235,30 +1237,33 @@ void addToAmatnrUp(vector vecs, int len, tag_t newPAmatnr, boolean l } } ITKCALL(BOM_line_copy(bom_line, cline, NULLTAG, &newChild)); - AOM_ask_value_string(cline, "bl_quantity", &oldQty); - AOM_ask_value_string(cline, "bl_sequence_no", &seqNo); - AOM_ask_value_string(cline, "bl_line_name", &bl_line_name); + if (newChild == NULLTAG) { + continue; + } + ITKCALL(AOM_ask_value_string(cline, "bl_quantity", &oldQty)); + ITKCALL(AOM_ask_value_string(cline, "bl_sequence_no", &seqNo)); + ITKCALL(AOM_ask_value_string(cline, "bl_line_name", &bl_line_name)); if (lastFlag && strstr(bl_line_name,"线")!=NULL) { double blQty = atof(oldQty); int num = blQty / xqLen; double fmodVal = fmod(blQty, xqLen); double lastVal = num + fmodVal; string numNew = to_string(lastVal); - AOM_lock(newChild); - AOM_set_value_string(newChild, "bl_quantity", numNew.c_str()); - AOM_set_value_string(newChild, "bl_sequence_no", seqNo); - AOM_save(newChild); - AOM_unlock(newChild); + ITKCALL(AOM_lock(newChild)); + ITKCALL(AOM_set_value_string(newChild, "bl_quantity", numNew.c_str())); + ITKCALL(AOM_set_value_string(newChild, "bl_sequence_no", seqNo)); + ITKCALL(AOM_save(newChild)); + ITKCALL(AOM_unlock(newChild)); } else { int blQty = atoi(oldQty); int num = blQty / len; string numNew = to_string(num); - AOM_lock(newChild); - AOM_set_value_string(newChild, "bl_quantity", numNew.c_str()); - AOM_set_value_string(newChild, "bl_sequence_no", seqNo); - AOM_save(newChild); - AOM_unlock(newChild); + ITKCALL(AOM_lock(newChild)); + ITKCALL(AOM_set_value_string(newChild, "bl_quantity", numNew.c_str())); + ITKCALL(AOM_set_value_string(newChild, "bl_sequence_no", seqNo)); + ITKCALL(AOM_save(newChild)); + ITKCALL(AOM_unlock(newChild)); } } @@ -1305,10 +1310,10 @@ void getPBomMsg(tag_t bom_line, map& bomMsgMap) { tag_t c_Rev; char *matnrNo, *cnt, *objName; ITKCALL(AOM_ask_value_tag(c_line_tags[t], BL_LINE_OBJECT, &c_Rev)); - AOM_ask_value_string(c_Rev, MATERIALNO, &matnrNo); + ITKCALL(AOM_ask_value_string(c_Rev, MATERIALNO, &matnrNo)); printf("zt2_MaterialNo===>%s\n", matnrNo); double qtyPXn = 1; - AOM_ask_value_string(c_line_tags[t], BL_QUANTITY, &cnt); + ITKCALL(AOM_ask_value_string(c_line_tags[t], BL_QUANTITY, &cnt)); if (strcmp(cnt, "") != 0) { qtyPXn = atof(cnt); } @@ -1347,11 +1352,11 @@ map getPBomMsg(tag_t mantrRev, bool& flag, vector& termCo tag_t c_Rev; char *matnrNo, *cnt, *objName; ITKCALL(AOM_ask_value_tag(c_line_tags[t], "bl_line_object", &c_Rev)); - AOM_ask_value_string(c_Rev, "zt2_MaterialNo", &matnrNo); + ITKCALL(AOM_ask_value_string(c_Rev, "zt2_MaterialNo", &matnrNo)); double qtyPXn = 1; - AOM_ask_value_string(c_line_tags[t], "bl_quantity", &cnt); - AOM_ask_value_string(c_Rev, OBJECT_NAME, &objName); + ITKCALL(AOM_ask_value_string(c_line_tags[t], "bl_quantity", &cnt)); + ITKCALL(AOM_ask_value_string(c_Rev, OBJECT_NAME, &objName)); printf("zt2_MaterialNo===>%s objName ===> %s\n", matnrNo, objName); if (checkName(objName)) { termCoils.push_back(c_Rev); @@ -1368,7 +1373,7 @@ map getPBomMsg(tag_t mantrRev, bool& flag, vector& termCo bomMsgMap[matnrNo] = qtyPXn; } } - BOM_close_window(ebom_window); + ITKCALL(BOM_close_window(ebom_window)); return bomMsgMap; } /** @@ -1448,6 +1453,8 @@ tag_t saveAsMaterial(EBomUpBean topBean, boolean isTop, printf("=======TEST====== %d \n", termCoils.size()); //升版并发布 没发布的产成品直接更新 if (isTcm(pMaterial) && isBomViewTcm(pMaterial)) { + printf("ITEM_copy_rev::%s\n", oldUid); + POM_AM__set_application_bypass(true); ITKCALL(ITEM_copy_rev(pMaterial, NULL, &pMaterial)); TCMAndOwner(pMaterial); if (isTop) { @@ -1461,6 +1468,7 @@ tag_t saveAsMaterial(EBomUpBean topBean, boolean isTop, printf("=======itemId====== %s \n", itemId); if (isTcm(termCoils[i]) && isBomViewTcm(termCoils[i])) { tag_t newPMantr; + POM_AM__set_application_bypass(true); ITKCALL(ITEM_copy_rev(termCoils[i], NULL, &newPMantr)); changeCoilOwner(newPMantr, termCoils[i]); //TCMAndOwner(newPMantr); @@ -1482,6 +1490,7 @@ tag_t saveAsMaterial(EBomUpBean topBean, boolean isTop, void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, boolean isTop, string &hasChange, map& saveAsMap) { //记录的EBOM下面的子件 + printf("startUpdate===>%s\n", upBean.matnrNo.c_str()); vector vecs = upBean.parentBean; int c_line_count = 0; tag_t* c_line_tags; @@ -1495,12 +1504,13 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, tag_t ebom_window2, *bvr_list2, bom_line; int bvr_count2 = 0; char* pBomUid; - (BOM_create_window(&ebom_window2)); + ITKCALL(BOM_create_window(&ebom_window2)); ITK__convert_tag_to_uid(pBomTop, &pBomUid); - (ITEM_rev_list_bom_view_revs(pBomTop, &bvr_count2, &bvr_list2)); + ITKCALL(ITEM_rev_list_bom_view_revs(pBomTop, &bvr_count2, &bvr_list2)); + printf(" pBomUid ===>%s \n", pBomUid); if (bvr_count2 == 0) { - //errBuff.append("不存在EBOM请检查\n"); + printf("不存在EBOM请检查\n"); //原来没有PBOM return; } @@ -1510,9 +1520,9 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, char* ifpBom, *matnrNo, *name; tag_t c_line_tag = c_line_tags[i], eRev; ITKCALL(AOM_ask_value_tag(c_line_tag, "bl_line_object", &eRev)); - AOM_ask_value_string(eRev, "zt2_ifpbom", &ifpBom); - AOM_ask_value_string(eRev, "zt2_MaterialNo", &matnrNo); - AOM_ask_value_string(eRev, "object_name", &name); + ITKCALL(AOM_ask_value_string(eRev, "zt2_ifpbom", &ifpBom)); + ITKCALL(AOM_ask_value_string(eRev, "zt2_MaterialNo", &matnrNo)); + ITKCALL(AOM_ask_value_string(eRev, "object_name", &name)); //移除PBOM printf("zt2_MaterialNo ===>%s ifpBom==>%s\n", matnrNo, ifpBom); if (strcmp(ifpBom, "P") == 0) { @@ -1522,7 +1532,7 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, //BOM_line_cut(c_line_tag); } else if (!checkName(name)) { - BOM_line_cut(c_line_tag);//pBomMap[matnrNo] = c_line_tag; + ITKCALL(BOM_line_cut(c_line_tag));//pBomMap[matnrNo] = c_line_tag; } else if (checkName(name)) { xqTagVec.push_back(c_line_tag); @@ -1530,6 +1540,7 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, } //移除所有非P 再从EBOM复制 printf("xqTagVec===>%d\n", xqTagVec.size()); + POM_AM__set_application_bypass(true); for (int i = 0; i < xqTagVec.size(); i++) { tag_t xqLine = xqTagVec[i],*c_xqLine_tags, newPAmatnr; int c_line_countXq = 0; @@ -1537,7 +1548,7 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, printf("c_line_countXq===>%d\n", c_line_countXq); //移除原来的 -> 进行对比是否有修改 for (int j = 0; j < c_line_countXq; j++) { - BOM_line_cut(c_xqLine_tags[j]); + ITKCALL(BOM_line_cut(c_xqLine_tags[j])); } ITKCALL(AOM_ask_value_tag(xqLine, "bl_line_object", &newPAmatnr)); //添加线圈下的东西 @@ -1549,29 +1560,30 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, } if (xqTagVec.size() == 0) { //不是线圈 移除后复制 - printf("vecs===>%d\n", vecs.size()); + printf("vecs===>%zd\n", vecs.size()); for (int i = 0; i < vecs.size(); i++) { + printf("i===>%d\n", i); EBomUpBean cupBean = vecs[i]; //重新复制 if (std::find(matnrVec.begin(), matnrVec.end(), cupBean.matnrNo) != matnrVec.end()) { + printf("matnrVec ===>%s\n", cupBean.matnrNo.c_str()); tag_t c_line_tag = pBomMap[cupBean.matnrNo]; tag_t c_Rev, bomView = NULLTAG; ITKCALL(AOM_ask_value_tag(c_line_tag, "bl_line_object", &c_Rev)); boolean flagAs = false; tag_t childPTag; - printf("matnrVec ===>%s\n", cupBean.matnrNo.c_str()); ITKCALL(AOM_ask_value_tag(c_line_tag, BL_LINE_OBJECT, &childPTag)); startUpdate(cupBean, childPTag, len, dcproxy, isTop, hasChange, saveAsMap); if (bomView != NULLTAG && flagAs) { - BOM_save_window(bomView); - BOM_close_window(bomView); + ITKCALL(BOM_save_window(bomView)); + ITKCALL(BOM_close_window(bomView)); } + printf("i2===>%d\n", i); } else { boolean flagLc = false; char* seq; - printf(" pBomUid ===>%s \n", pBomUid); printf("matnrVecNotP===>%s\n", cupBean.matnrNo.c_str()); tag_t cline = cupBean.bomline; tag_t newChild; @@ -1580,11 +1592,11 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, printf(" newChild === NULLTAG 没有权限修改BOM视图 \n"); continue; } - AOM_ask_value_string(cline, "bl_sequence_no", &seq); - AOM_lock(newChild); - AOM_set_value_string(newChild, "bl_sequence_no", seq); - AOM_save(newChild); - AOM_unlock(newChild); + ITKCALL(AOM_ask_value_string(cline, "bl_sequence_no", &seq)); + ITKCALL(AOM_lock(newChild)); + ITKCALL(AOM_set_value_string(newChild, "bl_sequence_no", seq)); + ITKCALL(AOM_save(newChild)); + ITKCALL(AOM_unlock(newChild)); tag_t c_Rev; ITKCALL(AOM_ask_value_tag(cline, "bl_line_object", &c_Rev)); @@ -1611,6 +1623,7 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, ITKCALL(BOM_save_window(ebom_window2)); ITKCALL(BOM_close_window(ebom_window2)); + printf("startUpdate end===>%s\n", upBean.matnrNo.c_str()); } /** * 复制BOM信息 @@ -1620,11 +1633,15 @@ void startUpdate(EBomUpBean upBean, tag_t pBomTag, int len, tag_t dcproxy, void copyBomLine(tag_t matnrTop, tag_t otherPbom) { tag_t ebom_window, ebom_window2, *bvr_list, *bvr_list2, bom_line, bom_line2, *c_line_tags, *c_line_tags2; int bvr_count = 0, bvr_count2 = 0, c_line_count, c_line_count2; - (BOM_create_window(&ebom_window)); - (ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); + ITKCALL(BOM_create_window(&ebom_window)); + ITKCALL(ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); printf("bvr_count=%d \n", bvr_count); if (bvr_count == 0) { //errBuff.append("不存在EBOM请检查\n"); + char* os = NULL; + ITKCALL(AOM_ask_value_string(matnrTop, "object_string", &os)); + printf("%sBOM数量为0\n", os); + return; } ITKCALL(BOM_set_window_top_line_bvr(ebom_window, bvr_list[0], &bom_line)); //顶层bom获取 printf("顶层bom获取\n"); @@ -1632,20 +1649,20 @@ void copyBomLine(tag_t matnrTop, tag_t otherPbom) { ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); - (ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); + ITKCALL(ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); if (bvr_count2 == 0) { tag_t newView, newViewBvr, pitem; - ITEM_ask_item_of_rev(otherPbom, &pitem); + ITKCALL(ITEM_ask_item_of_rev(otherPbom, &pitem)); ITKCALL(PS_create_bom_view(NULL, NULL, NULL, pitem, &newView)); - AOM_save(newView); + ITKCALL(AOM_save(newView)); ITKCALL(PS_create_bvr(newView, NULL, NULL, FALSE, otherPbom, &newViewBvr)); - AOM_save(newViewBvr); - AOM_save(otherPbom); + ITKCALL(AOM_save(newViewBvr)); + ITKCALL(AOM_save(otherPbom)); //return; - (ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); + ITKCALL(ITEM_rev_list_bom_view_revs(otherPbom, &bvr_count2, &bvr_list2)); } - (BOM_create_window(&ebom_window2)); - (BOM_set_window_top_line_bvr(ebom_window2, bvr_list2[0], &bom_line2)); //顶层bom获取 + ITKCALL(BOM_create_window(&ebom_window2)); + ITKCALL(BOM_set_window_top_line_bvr(ebom_window2, bvr_list2[0], &bom_line2)); //顶层bom获取 ITKCALL(BOM_line_ask_all_child_lines(bom_line2, &c_line_count2, &c_line_tags2)); for (int i = 0; i < c_line_count2; i++) { BOM_line_cut(c_line_tags2[i]); @@ -1654,10 +1671,10 @@ void copyBomLine(tag_t matnrTop, tag_t otherPbom) { tag_t newChild; char *bl_seqNo; ITKCALL(BOM_line_copy(bom_line2, c_line_tags[i], NULLTAG, &newChild)); - AOM_ask_value_string(c_line_tags[i], "bl_sequence_no", &bl_seqNo); - AOM_lock(newChild); - AOM_set_value_string(newChild, "bl_sequence_no", bl_seqNo); - AOM_save(newChild); + ITKCALL(AOM_ask_value_string(c_line_tags[i], "bl_sequence_no", &bl_seqNo)); + ITKCALL(AOM_lock(newChild)); + ITKCALL(AOM_set_value_string(newChild, "bl_sequence_no", bl_seqNo)); + ITKCALL(AOM_save(newChild)); //最后unlock AOM_unlock(newChild); } @@ -1665,8 +1682,8 @@ void copyBomLine(tag_t matnrTop, tag_t otherPbom) { //ITKCALL(BOM_line_copy(bom_line2, c_line_tags[i], NULLTAG, &newChild)); ITKCALL(BOM_save_window(ebom_window2)); - BOM_close_window(ebom_window2); - BOM_close_window(ebom_window); + ITKCALL(BOM_close_window(ebom_window2)); + ITKCALL(BOM_close_window(ebom_window)); } //EBOM转PBOM @@ -1734,10 +1751,10 @@ int EbomToPMethod(void* returnValue) { //找到图纸获取下面所有符合条件的E物料和P物料已有就更新 designRev = mantrs[0]; tag_t designItem; - ITEM_ask_item_of_rev(designRev,&designItem); - ITEM_ask_latest_rev(designItem,&designRev); + ITKCALL(ITEM_ask_item_of_rev(designRev,&designItem)); + ITKCALL(ITEM_ask_latest_rev(designItem,&designRev)); char* itemId; - AOM_ask_value_string(designRev, "item_id", &itemId); + ITKCALL(AOM_ask_value_string(designRev, "item_id", &itemId)); vector vec2; Split(itemId, "-", vec2); string idTop = "1ZDB300000P"; @@ -1745,8 +1762,8 @@ int EbomToPMethod(void* returnValue) { idTop = idTop.append("-").append(vec2[1]); } tag_t topItem, topDesginRev; - ITEM_find_item(idTop.c_str(), &topItem); - ITEM_ask_latest_rev(topItem, &topDesginRev); + ITKCALL(ITEM_find_item(idTop.c_str(), &topItem)); + ITKCALL(ITEM_ask_latest_rev(topItem, &topDesginRev)); len = getClassVal2(topItem, errBuff); printf("len%d\n", len); if (len > 0) { @@ -1760,39 +1777,48 @@ int EbomToPMethod(void* returnValue) { //遍历变压器图纸获取最新版本的E和P对象 for (int t = 0; t < num2; t++) { char* isPm, *zt2_MaterialNo, *zt2_WBSNo; - AOM_ask_value_string(topMatnrs[t], "zt2_WBSNo", &zt2_WBSNo); - AOM_ask_value_string(topMatnrs[t], "zt2_MaterialNo", &zt2_MaterialNo); - AOM_ask_value_string(topMatnrs[t], "zt2_ifpbom", &isPm); + ITKCALL(AOM_ask_value_string(topMatnrs[t], "zt2_WBSNo", &zt2_WBSNo)); + ITKCALL(AOM_ask_value_string(topMatnrs[t], "zt2_MaterialNo", &zt2_MaterialNo)); + ITKCALL(AOM_ask_value_string(topMatnrs[t], "zt2_ifpbom", &isPm)); string key = ""; key.append(zt2_WBSNo).append(zt2_MaterialNo); + printf("key===>%d\n", key.c_str()); if (wlbmMap.count(key) > 0) { E2PBean &bean = wlbmMap[key]; + char* revId; + //获取最新的版本 + ITKCALL(AOM_ask_value_string(topMatnrs[t], "item_revision_id", &revId)); + //if (strcmp(revId, bean.revId.c_str()) > 0) {} if (strcmp(isPm, "P") == 0) { - char* revId; - //获取最新的版本 - AOM_ask_value_string(topMatnrs[t], "item_revision_id", &revId); - if (strcmp(revId, bean.revId.c_str()) > 0) { + if (strcmp(revId, bean.prevId.c_str()) > 0) { + printf("3\n"); bean.pMantr = topMatnrs[t]; - bean.revId = revId; + bean.prevId = revId; } } else { - bean.eMantr = topMatnrs[t]; + if (strcmp(revId, bean.erevId.c_str()) > 0) { + printf("4\n"); + bean.eMantr = topMatnrs[t]; + bean.erevId = revId; + } } } else { E2PBean bean; bean.key = key; + char* revId; + ITKCALL(AOM_ask_value_string(topMatnrs[t], "item_revision_id", &revId)); if (strcmp(isPm, "P") == 0) { - char* revId; - AOM_ask_value_string(topMatnrs[t], "item_revision_id", &revId); + printf("1\n"); bean.pMantr = topMatnrs[t]; - bean.revId = revId; + bean.prevId = revId; } else { printf("2\n"); bean.eMantr = topMatnrs[t]; + bean.erevId = revId; } wlbmMap[key] = bean; } @@ -1823,8 +1849,8 @@ int EbomToPMethod(void* returnValue) { ITK__convert_tag_to_uid(matnrTop, &uida); printf("uida=%s \n", uida); //只有E物料新建的逻辑 - (BOM_create_window(&ebom_window)); - (ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); + ITKCALL(BOM_create_window(&ebom_window)); + ITKCALL(ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); printf("bvr_count=%d \n", bvr_count); if (bvr_count == 0) { errBuff.append("不存在EBOM请检查\n"); @@ -1850,7 +1876,7 @@ int EbomToPMethod(void* returnValue) { int url_num = 0; char** url_vals = NULL; - PREF_ask_char_values("database_tc", &url_num, &url_vals); + ITKCALL(PREF_ask_char_values("database_tc", &url_num, &url_vals)); string url = url_vals[0]; url.append("/").append(url_vals[2]); printf("url ==> %s \n", url.c_str()); @@ -1873,7 +1899,7 @@ int EbomToPMethod(void* returnValue) { char* newid = NULL; logical isModified = FALSE; tag_t item_type_tag, newRev, newItem; - TCTYPE_ask_type("Item", &item_type_tag); + ITKCALL(TCTYPE_ask_type("Item", &item_type_tag)); ITKCALL(USER_new_item_id(NULLTAG, item_type_tag, &isModified, &newid)); /*ITKCALL(NR_next_value("MEProcess", "item_id", NULLTAG, "", "", "", NULLTAG, "", "", &next_id));*/ @@ -1881,20 +1907,20 @@ int EbomToPMethod(void* returnValue) { ITKCALL(ITEM_copy_item(eMantr, newid, NULL, &newItem, &newRev)); //ITKCALL(AOM_set_value_string(newRev, "zt2_PMaterial", "PBOM")); char* matnrNo; - AOM_ask_value_string(eMantr, "zt2_MaterialNo", &matnrNo); - AOM_lock(newRev); - AOM_set_value_string(newRev, "zt2_ifpbom", "P"); - AOM_set_value_string(newRev, "zt2_MaterialNo", matnrNo); - AOM_save(newRev); - AOM_unlock(newRev); + ITKCALL(AOM_ask_value_string(eMantr, "zt2_MaterialNo", &matnrNo)); + ITKCALL(AOM_lock(newRev)); + ITKCALL(AOM_set_value_string(newRev, "zt2_ifpbom", "P")); + ITKCALL(AOM_set_value_string(newRev, "zt2_MaterialNo", matnrNo)); + ITKCALL(AOM_save(newRev)); + ITKCALL(AOM_unlock(newRev)); tag_t *structure_revisions,* bom_view_tags, dsuser; int revNum = 0, tagNum=0; - AOM_ask_value_tags(eMantr, "TC_Is_Represented_By", &num, &mantrs); + ITKCALL(AOM_ask_value_tags(eMantr, "TC_Is_Represented_By", &num, &mantrs)); //该权限 if (num > 0) { - AOM_ask_value_tags(newRev, "structure_revisions", &revNum, &structure_revisions); - AOM_ask_value_tags(newRev, "bom_view_tags", &tagNum, &bom_view_tags); - AOM_ask_value_tag(mantrs[0], "owning_user", &dsuser); + ITKCALL(AOM_ask_value_tags(newRev, "structure_revisions", &revNum, &structure_revisions)); + ITKCALL(AOM_ask_value_tags(newRev, "bom_view_tags", &tagNum, &bom_view_tags)); + ITKCALL(AOM_ask_value_tag(mantrs[0], "owning_user", &dsuser)); tag_t defGroup; ITKCALL(AOM_ask_value_tag(dsuser, "default_group", &defGroup)); ITKCALL(AOM_set_ownership(newItem, dsuser, defGroup)); @@ -1928,8 +1954,8 @@ int EbomToPMethod(void* returnValue) { //判断版本视图是否发布,如果发布了,升版 break; } - (BOM_create_window(&ebom_window)); - (ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); + ITKCALL(BOM_create_window(&ebom_window)); + ITKCALL(ITEM_rev_list_bom_view_revs(matnrTop, &bvr_count, &bvr_list)); printf("bvr_count=%d \n", bvr_count); if (bvr_count == 0) { errBuff.append("不存在EBOM请检查\n"); @@ -1944,7 +1970,7 @@ int EbomToPMethod(void* returnValue) { //ITKCALL(BOM_set_window_top_line_bvr(ebom_window2, bvr_list2[0], &bom_line2)); //顶层bom获取 int url_num = 0; char** url_vals = NULL; - PREF_ask_char_values("database_tc", &url_num, &url_vals); + ITKCALL(PREF_ask_char_values("database_tc", &url_num, &url_vals)); string url = url_vals[0]; url.append("/").append(url_vals[2]); printf("url ==> %s \n", url.c_str()); @@ -1974,23 +2000,23 @@ int EbomToPMethod(void* returnValue) { continue; } tag_t newRev = tagBean.pMantr; - printf("newRev===>%s\n", tagBean.revId.c_str()); + //printf("newRev===>%s\n", tagBean.revId.c_str()); int structs = 0, statusNum = 0; tag_t* structure_revisions, *release_status_list; - AOM_ask_value_tags(newRev, "structure_revisions", &structs, &structure_revisions); + ITKCALL(AOM_ask_value_tags(newRev, "structure_revisions", &structs, &structure_revisions)); if (structs > 0 && hasChange.compare("true") != 0) { - AOM_ask_value_tags(structure_revisions[0], "release_status_list", &statusNum, &release_status_list); + ITKCALL(AOM_ask_value_tags(structure_revisions[0], "release_status_list", &statusNum, &release_status_list)); if (statusNum > 0) { int revNum = 0; tag_t *mantrsAs, dsuser; ITKCALL(ITEM_copy_rev(newRev, NULL, &newRev)); - AOM_ask_value_tags(matnrTop, "TC_Is_Represented_By", &num, &mantrsAs); - AOM_ask_value_tag(mantrsAs[0], "owning_user", &dsuser); + ITKCALL(AOM_ask_value_tags(matnrTop, "TC_Is_Represented_By", &num, &mantrsAs)); + ITKCALL(AOM_ask_value_tag(mantrsAs[0], "owning_user", &dsuser)); tag_t defGroup; ITKCALL(AOM_ask_value_tag(dsuser, "default_group", &defGroup)); ITKCALL(AOM_set_ownership(newRev, dsuser, defGroup)); if (num > 0) { - AOM_ask_value_tags(newRev, "structure_revisions", &revNum, &structure_revisions); + ITKCALL(AOM_ask_value_tags(newRev, "structure_revisions", &revNum, &structure_revisions)); if (revNum > 0) { ITKCALL(AOM_set_ownership(structure_revisions[0], dsuser, defGroup)); } diff --git a/General/General/General - 鍓湰.vcxproj b/General/General/General - 鍓湰.vcxproj new file mode 100644 index 0000000..82a4ac8 --- /dev/null +++ b/General/General/General - 鍓湰.vcxproj @@ -0,0 +1,239 @@ +锘 + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {69AF44E1-87DF-4DE6-B996-699B397016E8} + Win32Proj + General + General + 10.0 + + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;GENERAL_EXPORTS;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;GENERAL_EXPORTS;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;GENERAL_EXPORTS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_USRDLL;_CONSOLE;IPLIB=none;%(PreprocessorDefinitions) + false + Z:\TC_install\ZhengTai\c\libcurl-vc15-x64-release-dll-ipv6-sspi-schannel\include;Z:\TC_install\YSR\c\TC11.6\include;Z:\TC_install\YSR\c\TC11.6\include_cpp;Z:\TC_install\YSR\c\clib\OCI\include;Z:\TC_install\ZhengTai\c\libxl\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + Z:\TC_install\YSR\c\TC11.6\lib\*.lib;Z:\TC_install\ZhengTai\c\libxl\lib\*.lib;%(AdditionalDependencies) + Z:\TC_install\YSR\c\TC11.6\lib;Z:\TC_install\ZhengTai\c\libxl\lib;%(AdditionalLibraryDirectories) + libuser_exits.ar.lib;%(IgnoreSpecificDefaultLibraries) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + + + + + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + \ No newline at end of file diff --git a/General/General/General.vcxproj b/General/General/General.vcxproj index 82a4ac8..166effd 100644 --- a/General/General/General.vcxproj +++ b/General/General/General.vcxproj @@ -23,7 +23,7 @@ Win32Proj General General - 10.0 + 8.1 @@ -41,14 +41,14 @@ DynamicLibrary false - v143 + v140 true Unicode DynamicLibrary false - v143 + v140 true Unicode @@ -184,6 +184,7 @@ + diff --git a/General/General/General.vcxproj.filters b/General/General/General.vcxproj.filters index 10ff400..8a24121 100644 --- a/General/General/General.vcxproj.filters +++ b/General/General/General.vcxproj.filters @@ -218,5 +218,8 @@ 婧愭枃浠 + + epm-handler + \ No newline at end of file diff --git a/General/General/chint_add_to_workflow.cpp b/General/General/chint_add_to_workflow.cpp index 30cf4aa..7a1f17b 100644 --- a/General/General/chint_add_to_workflow.cpp +++ b/General/General/chint_add_to_workflow.cpp @@ -195,33 +195,58 @@ int CHINT_Assignment(EPM_action_message_t msg) { } void addToFlow(tag_t bom_line,tag_t rootTask_tag, map &uidMap) { - int structs=0; - tag_t rev, *structure_revisions; + int structs = 0; + tag_t rev = NULLTAG, *structure_revisions = NULL; ITKCALL(AOM_ask_value_tag(bom_line, "bl_line_object", &rev)); - int attachment_types = EPM_reference_attachment; - int attachment_types2 = EPM_target_attachment; + int reference = EPM_reference_attachment; + int target = EPM_target_attachment; //版本有BOM视图且发布 - AOM_ask_value_tags(rev,"structure_revisions", &structs,&structure_revisions); + ITKCALL(AOM_ask_value_tags(rev, "structure_revisions", &structs, &structure_revisions)); if (structs > 0) { int statusNum = 0, statusNum2=0; - char *revUid; - tag_t *release_status_list,*release_status_list2; - tag_t struct_revision = structure_revisions[0]; - AOM_ask_value_tags(struct_revision,"release_status_list",&statusNum,&release_status_list); - ITK__convert_tag_to_uid(rev,&revUid); - printf("revUid%s\n", revUid); - if (statusNum==0 && uidMap.count(revUid)==0) { + char *revUid = NULL, *bomUid = NULL; + tag_t *release_status_list, *release_status_list2; + ITK__convert_tag_to_uid(rev, &revUid); + //printf("revUid:%s\n", revUid); + if (uidMap.count(revUid) == 0) { uidMap[revUid] = "1"; + ITKCALL(AOM_ask_value_tags(rev, "release_status_list", &statusNum, &release_status_list2)); + if (statusNum > 0) { + //已发布的版本放在引用关系 + ITKCALL(EPM_add_attachments(rootTask_tag, 1, &rev, &reference)); + } + else { + tag_t *stageTags; + int stageNum = 0; + ITKCALL(AOM_ask_value_tags(rev, "process_stage_list", &stageNum, &stageTags)); + if (stageNum > 0) { + //已有流程的版本放在引用关系 + ITKCALL(EPM_add_attachments(rootTask_tag, 1, &rev, &reference)); + } + else { + //否则放在目标关系 + ITKCALL(EPM_add_attachments(rootTask_tag, 1, &rev, &target)); + } + } + } + + tag_t struct_revision = structure_revisions[0]; + ITK__convert_tag_to_uid(struct_revision, &bomUid); + //printf("bomUid:%s\n", bomUid); + statusNum = 0; + ITKCALL(AOM_ask_value_tags(struct_revision, "release_status_list", &statusNum, &release_status_list)); + if (statusNum==0 && uidMap.count(bomUid)==0) { + uidMap[bomUid] = "1"; tag_t *stageTags; int stageNum = 0; - AOM_ask_value_tags(struct_revision, "process_stage_list", &stageNum, &stageTags); + ITKCALL(AOM_ask_value_tags(struct_revision, "process_stage_list", &stageNum, &stageTags)); if (stageNum > 0) { - EPM_add_attachments(rootTask_tag, 1, &struct_revision, &attachment_types); + ITKCALL(EPM_add_attachments(rootTask_tag, 1, &struct_revision, &reference)); } else { - EPM_add_attachments(rootTask_tag, 1, &struct_revision, &attachment_types2); + ITKCALL(EPM_add_attachments(rootTask_tag, 1, &struct_revision, &target)); } - EPM_add_attachments(rootTask_tag, 1, &rev, &attachment_types); + //ITKCALL(EPM_add_attachments(rootTask_tag, 1, &rev, &attachment_types)); } } @@ -755,9 +780,9 @@ int chint_add_to_workflow(EPM_action_message_t msg) { ECHO("chint_add_to_workflow 开始执行\n"); ECHO("=========================================================\n"); - EPM_ask_root_task(msg.task, &root_task); - EPM_ask_sub_tasks(root_task, &sub_task_count, &sub_tasks); - EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &taskAttches); + ITKCALL(EPM_ask_root_task(msg.task, &root_task)); + ITKCALL(EPM_ask_sub_tasks(root_task, &sub_task_count, &sub_tasks)); + ITKCALL(EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &taskAttches)); map itemMap; map uidMap; for (int count = 0; count < occur_of_counts; count++) @@ -773,29 +798,29 @@ int chint_add_to_workflow(EPM_action_message_t msg) { //ITKCALL(TCTYPE_ask_object_type(taskAttches[count], &type_tag)); char *type; tag_t taskTag = taskAttches[count]; - AOM_ask_value_string(taskTag, "object_type", &type); + ITKCALL(AOM_ask_value_string(taskTag, "object_type", &type)); if (strcmp(type, "Part Revision") == 0) { tag_t itemTag; char *itemId; - AOM_ask_value_string(taskTag, "item_id", &itemId); - ITEM_ask_item_of_rev(taskTag, &itemTag); + ITKCALL(AOM_ask_value_string(taskTag, "item_id", &itemId)); + ITKCALL(ITEM_ask_item_of_rev(taskTag, &itemTag)); itemMap[itemId] = itemTag; break; } else if (strcmp(type, "ZT2_Design3DRevision") == 0) { tag_t* comps; int cnt; - AOM_ask_value_tags(taskTag, "representation_for", &cnt, &comps); + ITKCALL(AOM_ask_value_tags(taskTag, "representation_for", &cnt, &comps)); for (int i = 0; i < cnt; i++) { tag_t comp = comps[i]; char *partType,*zt2_ifpbom; - AOM_ask_value_string(comp, "object_type", &partType); - AOM_ask_value_string(comp, "zt2_ifpbom", &zt2_ifpbom); + ITKCALL(AOM_ask_value_string(comp, "object_type", &partType)); + ITKCALL(AOM_ask_value_string(comp, "zt2_ifpbom", &zt2_ifpbom)); if (strcmp(partType, "Part Revision") == 0 && strcmp(zt2_ifpbom,"P")!=0) { char *itemId; tag_t itemTag; - AOM_ask_value_string(comp, "item_id", &itemId); - ITEM_ask_item_of_rev(comp, &itemTag); + ITKCALL(AOM_ask_value_string(comp, "item_id", &itemId)); + ITKCALL(ITEM_ask_item_of_rev(comp, &itemTag)); if (itemMap.count(itemId) == 0) { itemMap[itemId] = itemTag; } @@ -810,14 +835,14 @@ int chint_add_to_workflow(EPM_action_message_t msg) { tag_t part = itemMap[s]; //遍历BOM获取所有要投料的 - tag_t* bvr_list = NULL, ebom_window, bom_line, partRev; - int bvr_count; - ITEM_ask_latest_rev(part, &partRev); + tag_t* bvr_list = NULL, ebom_window = NULL, bom_line = NULL, partRev = NULL; + int bvr_count = 0; + ITKCALL(ITEM_ask_latest_rev(part, &partRev)); ITKCALL(ITEM_rev_list_bom_view_revs(partRev, &bvr_count, &bvr_list)); ITKCALL(BOM_create_window(&ebom_window)); ITKCALL(BOM_set_window_top_line(ebom_window, NULL, partRev, NULLTAG, &bom_line)); - addToFlow(bom_line,root_task, uidMap); + addToFlow(bom_line, root_task, uidMap); ITKCALL(BOM_close_window(ebom_window)); } @@ -836,23 +861,22 @@ int chint_remove_other_deisgndata(EPM_action_message_t msg) { ECHO("=========================================================\n"); ECHO("chint_remove_other_deisgndata 开始执行\n"); ECHO("=========================================================\n"); - EPM_ask_root_task(msg.task, &root_task); - EPM_ask_sub_tasks(root_task, &sub_task_count, &sub_tasks); - EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &taskAttches); + ITKCALL(EPM_ask_root_task(msg.task, &root_task)); + ITKCALL(EPM_ask_sub_tasks(root_task, &sub_task_count, &sub_tasks)); + ITKCALL(EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &taskAttches)); - EPM_ask_attachments(root_task, EPM_reference_attachment, &occur_of_counts2, &taskAttches2); - AOM_ask_value_tag(root_task, "owning_user", &owning_user); - char *userId; - AOM_ask_value_string(owning_user,"user_id",&userId); + ITKCALL(EPM_ask_attachments(root_task, EPM_reference_attachment, &occur_of_counts2, &taskAttches2)); + ITKCALL(AOM_ask_value_tag(root_task, "owning_user", &owning_user)); + char *userId = NULL; + ITKCALL(AOM_ask_value_string(owning_user,"user_id",&userId)); for (int count = 0; count < occur_of_counts2; count++) { //ITKCALL(TCTYPE_ask_object_type(taskAttches[count], &type_tag)); - char *type, *tagId; + char *type = NULL, *tagId = NULL, *os = NULL; tag_t taskTag = taskAttches2[count], tagUser; - AOM_ask_value_string(taskTag, "object_type", &type); - printf("type===>%s\n", type); - AOM_ask_value_tag(taskTag, "owning_user", &tagUser); - AOM_ask_value_string(tagUser, "user_id", &tagId); + ITKCALL(AOM_ask_value_string(taskTag, "object_type", &type)); + ITKCALL(AOM_ask_value_tag(taskTag, "owning_user", &tagUser)); + ITKCALL(AOM_ask_value_string(tagUser, "user_id", &tagId)); if (strcmp(tagId, userId) != 0) { ITKCALL(EPM_remove_attachments(root_task, 1, &taskTag)); /*if (strcmp(type, "ZT2_Design3DRevision") == 0) { @@ -866,13 +890,69 @@ int chint_remove_other_deisgndata(EPM_action_message_t msg) { for (int count = 0; count < occur_of_counts; count++) { //ITKCALL(TCTYPE_ask_object_type(taskAttches[count], &type_tag)); - char *type,*tagId; - tag_t taskTag = taskAttches[count],tagUser; - AOM_ask_value_string(taskTag, "object_type", &type); - printf("type===>%s\n", type); - AOM_ask_value_tag(taskTag, "owning_user", &tagUser); - AOM_ask_value_string(tagUser, "user_id", &tagId); - if (strcmp(tagId, userId)!=0) { + char *type = NULL, *tagId = NULL, *os = NULL; + tag_t taskTag = taskAttches[count], tagUser = NULLTAG; + ITKCALL(AOM_ask_value_string(taskTag, "object_type", &type)); + ITKCALL(AOM_ask_value_string(taskTag, "object_string", &os)); + printf("taskTag:%s===>%s\n", os, type); + //物料版本和物料视图版本的权限由物料所关联的图纸的所有权进行判断 + //如果物料版本所关联的图纸(itemid是1ZDB开头)是当前流程发起人,那么此物料版本不需要移除,反之需要移除,如果物料关联的2ZD开头的图纸,那么也是不需要移除的 + if (strcmp(type, "Part Revision") == 0) { + tag_t* comps = NULL; + int cnt = 0; + ITKCALL(AOM_ask_value_tags(taskTag, "TC_Is_Represented_By", &cnt, &comps)); + if (cnt > 0) { + char *id = NULL; + ITKCALL(AOM_ask_value_string(comps[0], "item_id", &id)); + printf("id===>%s\n", id); + if (id[0] == '2') { + continue; + } + ITKCALL(AOM_ask_value_tag(comps[0], "owning_user", &tagUser)); + } + else { + continue; + } + } + else if (strcmp(type, "BOMView Revision") == 0) { + int refCnt = 0, *levels = NULL; + tag_t *refs = NULL; + char **rels = NULL; + ITKCALL(WSOM_where_referenced2(taskTag, 1, &refCnt, &levels, &refs, &rels)); + for (int i = 0; i < refCnt; i++) { + printf("rels===>%s\n", rels[i]); + if (tc_strcmp(rels[i], "") == 0) {//structure_revisions + char *revtype = NULL; + ITKCALL(AOM_ask_value_string(refs[i], "object_type", &revtype)); + printf("revtype===>%s\n", revtype); + if (tc_strcmp(type, "Part Revision") != 0) { + ITKCALL(AOM_ask_value_tag(taskTag, "owning_user", &tagUser)); + break; + } + tag_t* comps = NULL; + int cnt = 0; + ITKCALL(AOM_ask_value_tags(refs[i], "TC_Is_Represented_By", &cnt, &comps)); + if (cnt > 0) { + char *id = NULL; + ITKCALL(AOM_ask_value_string(comps[0], "item_id", &id)); + printf("id===>%s\n", id); + if (id[0] == '2') { + continue; + } + ITKCALL(AOM_ask_value_tag(comps[0], "owning_user", &tagUser)); + } + break; + } + } + if (tagUser == NULLTAG) + continue; + } + else { + ITKCALL(AOM_ask_value_tag(taskTag, "owning_user", &tagUser)); + } + ITKCALL(AOM_ask_value_string(tagUser, "user_id", &tagId)); + printf("tagId===>%s\n", tagId); + if (strcmp(tagId, userId) != 0) { ITKCALL(EPM_remove_attachments(root_task, 1, &taskTag)); /*if (strcmp(type, "ZT2_Design3DRevision") == 0) { ITKCALL(EPM_remove_attachments(root_task, 1, &taskTag)); diff --git a/General/General/chint_ecn_signoff.cxx b/General/General/chint_ecn_signoff.cxx new file mode 100644 index 0000000..57e843d --- /dev/null +++ b/General/General/chint_ecn_signoff.cxx @@ -0,0 +1,402 @@ + +#include +#include +#include +#include +#include "string_utils.h" +#include "ocilib.h" +#include "chint_Handler.h" +#include "epm_handler_common.h" +#include "CRUL_server_call_httpserver.h" + +void get_now_str(char *date_time) +{ + time_t the_time; + struct tm *time_ptr; + char *time_format = "%Y-%m-%d"; + + the_time = time((time_t *)0); + time_ptr = localtime(&the_time); + strftime(date_time, 128, time_format, time_ptr); +} + +int create_data_file(char *file_content, char *item_id, char **file_name) { + time_t now; + struct tm *p; + FILE *filePtr = NULL; + + char *temp_dir = getenv("TEMP"); + char local_path[MAX_PATH] = ""; + + time(&now); + p = localtime(&now); + if (temp_dir[strlen(temp_dir) - 1] == '\\') + { + sprintf_s(local_path, "%s%s-%d-%d-%d-%d-%d-%d.dat", temp_dir, item_id, + 1900 + p->tm_year, p->tm_mon + 1, p->tm_mday + 1, p->tm_hour, p->tm_min, p->tm_sec); + } + else + { + sprintf_s(local_path, "%s\\%s-%d-%d-%d-%d-%d-%d.dat", temp_dir, item_id, + 1900 + p->tm_year, p->tm_mon + 1, p->tm_mday + 1, p->tm_hour, p->tm_min, p->tm_sec); + } + + if ((filePtr = fopen(local_path, "wt")) == NULL) + { + printf("Can not create the temp dat file!\n"); + return -1; + } + *file_name = (char *)MEM_alloc(sizeof(char) * 512); + strcpy((*file_name), local_path); + + fwrite(file_content, sizeof(char), strlen(file_content), filePtr); + fclose(filePtr); + + return ITK_ok; +} + +int signoff(tag_t dataset, char *dat_file, char *ext) { + tag_t spec_dataset_rev = NULLTAG, ref_object = NULLTAG; + AE_reference_type_t reference_type; + char ref_name[WSO_name_size_c + 1] = "excel"; + + ITKCALL(AE_ask_dataset_latest_rev(dataset, &spec_dataset_rev)); + ITKCALL(AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object)); + if (reference_type == AE_PART_OF) + { + char pathname[SS_MAXPATHLEN] = ""; + ITKCALL(IMF_ask_file_pathname(ref_object, SS_WNT_MACHINE, pathname)); + char origin_file_name[IMF_filename_size_c + 1] = ""; + ITKCALL(IMF_ask_original_file_name(ref_object, origin_file_name)); + + char new_ds_name[WSO_name_size_c + 1] = ""; + char *new_file_name = USER_new_file_name(new_ds_name, ref_name, ext, 0); + char *temp_dir = getenv("temp"); + temp_dir = "D:\\TEMP"; + char temp_file[SS_MAXPATHLEN] = ""; + strcpy(temp_file, temp_dir); + strcat(temp_file, "\\"); + strcat(temp_file, new_file_name); + + ITKCALL(IMF_export_file(ref_object, temp_file)); + + char cmd[256] = ""; + strcpy(cmd, "SubstMacros-MSExcel.wsf"); + strcat(cmd, " \""); + strcat(cmd, temp_file); + strcat(cmd, "\" \""); + strcat(cmd, dat_file); + strcat(cmd, "\""); + printf("cmd ==>%s\n", cmd); + system(cmd); + + //strcpy(user_lib_env, local_path); + + + POM_AM__set_application_bypass(true); + tag_t new_file_tag = NULLTAG; + IMF_file_t file_descriptor; + ITKCALL(IMF_import_file(temp_file, new_file_name, SS_BINARY, &new_file_tag, &file_descriptor)); + ITKCALL(IMF_set_original_file_name(new_file_tag, origin_file_name)); + ITKCALL(IMF_close_file(file_descriptor)); + ITKCALL(AOM_save(new_file_tag)); + ITKCALL(AOM_unlock(new_file_tag)); + + ITKCALL(AOM_lock(spec_dataset_rev)); + ITKCALL(AE_remove_dataset_named_ref_by_tag(spec_dataset_rev, ref_name, ref_object)); + ITKCALL(AE_add_dataset_named_ref(spec_dataset_rev, ref_name, AE_PART_OF, new_file_tag)); + ITKCALL(AOM_save(spec_dataset_rev)); + ITKCALL(AOM_unlock(spec_dataset_rev)); + POM_AM__set_application_bypass(false); + } + + return ITK_ok; +} + +int chint_ecn_signoff(EPM_action_message_t msg) { + printf("=========================================================\n"); + printf("chint_ecn_signoff 开始执行\n"); + printf("=========================================================\n"); + + int ifail = ITK_ok, occur_of_counts = 0, url_num = 0; + char** url_vals = NULL, *task_name = NULL; + tag_t root_task = NULLTAG, *targets = NULL; + map sign_map; + sign_map.insert(pair("编制", "zt2_Design")); + sign_map.insert(pair("校对", "zt2_Proofread")); + sign_map.insert(pair("审定", "zt2_Review")); + sign_map.insert(pair("标准化", "zt2_Normalization")); + //sign_map.insert(pair("会签", "zt2_Countersign")); + sign_map.insert(pair("批准", "zt2_Approve")); + + ITKCALL(EPM_ask_name2(msg.task, &task_name)); + printf("task_name ==>%s\n", task_name); + //if (tc_strcmp(task_name, "会签") == 0) { + //} + ITKCALL(PREF_ask_char_values("database_tc", &url_num, &url_vals)); + string url = url_vals[0]; + url.append("/").append(url_vals[2]); + printf("url ==>%s\n", url.c_str()); + if (ConnServer(url_vals[3], url_vals[4], (char*)url.c_str()) == -1) { + printf("中间数据表访问失败\n"); + ifail = 919050; + EMH_store_error(EMH_severity_error, ifail); + return ifail; + } + ITKCALL(EPM_ask_root_task(msg.task, &root_task)); + ITKCALL(EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &targets)); + for (int t = 0; t < occur_of_counts; t++) { + char* type = NULL; + ITKCALL(WSOM_ask_object_type2(targets[t], &type)); + if (tc_strcmp(type, "ZT2_Change") != 0) { + continue; + } + char* id = NULL; + ITKCALL(AOM_ask_value_string(targets[t], "item_id", &id)); + printf("id ===>%s\n", id); + /*if (tc_strcmp(task_name, "会签") == 0) { + ITKCALL(AOM_set_value_string(targets[t], "zt2_Countersign", name.c_str())); + char now_date_str[128 + 1] = { "\0" }; + get_now_str(now_date_str); + //date_t now; + //ITKCALL(ITK_string_to_date(current_date_time_str, &now)); + printf("now_date_str ===>%s\n", now_date_str); + ITKCALL(AOM_set_value_string(targets[t], "zt2_CountersignTime", now_date_str)); + }*/ + string sql = "select \"principal\" FROM CHINT_ECN_NOTIFICATION where \"result\"='是' and \"ecncode\"='"; + sql.append(id).append("'"); + int outputColumn1 = 0, outputValueCount1 = 0; + char*** outputValue1 = NULL; + printf("sql ===>%s\n", sql.c_str()); + QuerySQLNoInputParam((char*)sql.c_str(), &outputColumn1, &outputValueCount1, &outputValue1); + vector name_vec; + for (int i = 0; i < outputValueCount1; i++) { + vector names; + if (tc_strstr(outputValue1[i][0], ":") == NULL) { + Split(outputValue1[i][0], ";", names); + } + else { + Split(outputValue1[i][0], ":", names); + } + if (find(name_vec.begin(), name_vec.end(), names[0]) == name_vec.end()) + name_vec.push_back(names[0]); + } + string name = ""; + for (int i = 0; i < name_vec.size(); i++) { + if (name.size() > 0) + name.append(" "); + name.append(name_vec[i]); + } + printf("name ===>%s\n", name.c_str()); + + tag_t *datasets = NULL; + int cnt = 0; + ITKCALL(AOM_ask_value_tags(targets[t], "IMAN_reference", &cnt, &datasets)); + if (cnt < 1) { + printf("未找到excel数据集\n"); + continue; + } + string info = ""; + map::iterator it; + for (it = sign_map.begin(); it != sign_map.end(); it++) { + string prop = it->second.c_str(); + prop.append("Time"); + char *name_val = NULL, *date_val = NULL; + ITKCALL(AOM_ask_value_string(targets[t], it->second.c_str(), &name_val)); + ITKCALL(AOM_ask_value_string(targets[t], prop.c_str(), &date_val)); + info.append(it->first); + info.append("="); + info.append(name_val); + info.append(" "); + info.append(date_val); + info.append("|"); + } + info.append("会签"); + info.append("="); + info.append(name); + info.append("|"); + char *data_file = NULL; + create_data_file((char*)info.c_str(), id, &data_file); + printf("data_file ==>%s\n", data_file); + for (int i = 0; i < cnt; i++) { + char* ref_type = NULL; + ITKCALL(WSOM_ask_object_type2(datasets[i], &ref_type)); + if (tc_strcmp(ref_type, "MSExcelX") == 0) { + signoff(datasets[i], data_file, "xlsx"); + break; + } + } + } + //if (tc_strcmp(task_name, "会签") == 0) { + //} + DisConnServer(); + printf("=========================================================\n"); + printf("chint_ecn_signoff 执行结束\n"); + printf("=========================================================\n"); + return ifail; +} + +int chint_ecn_assign(EPM_action_message_t msg) { + printf("=========================================================\n"); + printf("chint_ecn_assign 开始执行\n"); + printf("=========================================================\n"); + + int ifail = ITK_ok, occur_of_counts = 0, url_num = 0; + char** url_vals = NULL, *task_name = NULL; + tag_t root_task = NULLTAG, *targets = NULL; + + tag_t query_tag = NULLTAG; + ITKCALL(QRY_find2("管理 - 员工信息", &query_tag)); + if (query_tag == NULL) + { + printf("未找到查询:管理 - 员工信息\n"); + ifail = 919051; + EMH_store_error(EMH_severity_error, ifail); + return ifail; + } + ITKCALL(PREF_ask_char_values("database_tc", &url_num, &url_vals)); + string url = url_vals[0]; + url.append("/").append(url_vals[2]); + printf("url ==>%s\n", url.c_str()); + if (ConnServer(url_vals[3], url_vals[4], (char*)url.c_str()) == -1) { + printf("中间数据表访问失败\n"); + ifail = 919050; + ITKCALL(EMH_store_error_s1(EMH_severity_error, ifail, "database_tc")); + return ifail; + } + + ITKCALL(EPM_ask_root_task(msg.task, &root_task)); + ITKCALL(EPM_ask_attachments(root_task, EPM_target_attachment, &occur_of_counts, &targets)); + for (int t = 0; t < occur_of_counts; t++) { + char* type = NULL; + ITKCALL(WSOM_ask_object_type2(targets[t], &type)); + if (tc_strcmp(type, "ZT2_Change") != 0) { + continue; + } + char* id = NULL; + ITKCALL(AOM_ask_value_string(targets[t], "item_id", &id)); + printf("id ===>%s\n", id); + string sql = "select \"principal\",\"section\" FROM CHINT_ECN_NOTIFICATION where \"result\"='是' and \"ecncode\"='"; + sql.append(id).append("'"); + int outputColumn1 = 0, outputValueCount1 = 0; + char*** outputValue1 = NULL; + printf("sql ===>%s\n", sql.c_str()); + QuerySQLNoInputParam((char*)sql.c_str(), &outputColumn1, &outputValueCount1, &outputValue1); + printf("outputValueCount1 ===>%d\n", outputValueCount1); + //如果section列获取的数据中包含非技术部、工艺部的人员,当前节点无需指派人员 + boolean pro = false; + for (int i = 0; i < outputValueCount1; i++) { + if (tc_strcmp(outputValue1[i][1], "技术部") != 0 && tc_strcmp(outputValue1[i][1], "工艺部") != 0) { + pro = true; + break; + } + } + if (pro) { + continue; + } + vector name_vec; + for (int i = 0; i < outputValueCount1; i++) { + printf("i ===>%d\n", i); + if (name_vec.size() > 0 && find(name_vec.begin(), name_vec.end(), outputValue1[i][0]) != name_vec.end()) + continue; + name_vec.push_back(outputValue1[i][0]); + vector names, names2; + Split(outputValue1[i][0], ";", names); + printf("names ===>%zd\n", names.size()); + if (tc_strcmp(names[0].c_str(), "null") == 0) { + continue; + } + Split(names[0], ":", names2); + printf("names2 ===>%zd\n", names2.size()); + if (find(name_vec.begin(), name_vec.end(), names2[0]) != name_vec.end()) + continue; + name_vec.push_back(names2[0]); + string id = ""; + if (names2.size() > 1) { + id = names2[1]; + } + else { + //使用分号后的内容调用OA接口,获取用户id + char *url = NULL; + ITKCALL(PREF_ask_char_value("CHINT_OA_GetUserItems", 0, &url)); + if (url == NULL) { + printf("CHINT_OA_GetUserItems首选项配置不正确!\n"); + DisConnServer(); + ifail = 919052; + EMH_store_error_s1(EMH_severity_error, ifail, "CHINT_OA_GetUserItems"); + return ifail; + } + printf("url ===>%s\n", url); + string userXML = getUserIdOAUUID(names[1], url); + //printf("userXML ===>%s\n", userXML.c_str()); + id = readXmlEmailId(userXML); + if (tc_strcmp(id.c_str(), "Fault") == 0) { + printf("OA获取用户ID失败!\n"); + id = ""; + //DisConnServer(); + //ifail = 919052; + //EMH_store_error_s1(EMH_severity_error, ifail, userXML.c_str()); + //return ifail; + } + else { + vector emailId; + Split(id, "@", emailId); + id = emailId[0]; + } + } + printf("id ===>%s\n", id.c_str()); + if (id.size() == 0) { + printf("未找到用户id:%s\n", outputValue1[i][0]); + continue; + } + char **qkey = NULL, **qvalue = NULL, *userid = (char *)id.c_str(); + int num_found = 0; + tag_t *qresult = NULL; + + const char *cpxh = "用户 ID";//GbkToUtf8("产品型号").c_str(); + qkey = (char **)MEM_alloc(1 * sizeof(char*)); + qvalue = (char **)MEM_alloc(1 * sizeof(char*)); + qkey[0] = (char *)MEM_alloc((tc_strlen(cpxh) + 1) * sizeof(char)); + qvalue[0] = (char *)MEM_alloc((tc_strlen(userid) + 1) * sizeof(char)); + tc_strcpy(qkey[0], cpxh); + tc_strcpy(qvalue[0], userid); + ITKCALL(QRY_execute(query_tag, 1, qkey, qvalue, &num_found, &qresult)); + if (num_found == 0) { + printf("未找到用户:%s\n", userid); + DisConnServer(); + ifail = 919052; + EMH_store_error_s1(EMH_severity_error, ifail, userid); + return ifail; + } + //移除当前节点指派的dcproxy账户 + int signoff_count = 0; + tag_t *signoffs = NULL, parent = NULLTAG; + ITKCALL(EPM_ask_parent_task(msg.task, &parent)); + ITKCALL(EPM_ask_attachments(msg.task, EPM_signoff_attachment, &signoff_count, &signoffs)); + for (int i = 0; i < signoff_count; i++) { + tag_t member = NULLTAG; + SIGNOFF_TYPE_t stype; + char *name = NULL, *os = NULL, *type = NULL; + ITKCALL(EPM_ask_signoff_member(signoffs[i], &member, &stype)); + ITKCALL(AOM_ask_value_string(member, "object_string", &os)); + printf("member = %s\n", os); + if (tc_strstr(os, "dcproxy") != NULL) { + ITKCALL(EPM_remove_signoffs(parent, 1, &member)); + } + } + //将人员指派至当前节点 + int signoff_cnt = 0; + tag_t *signoff_tags = NULLTAG; + ITKCALL(EPM_create_adhoc_signoff(msg.task, qresult[0], &signoff_cnt, &signoff_tags)); + } + } + DisConnServer(); + + POM_AM__set_application_bypass(true); + ITKCALL(EPM_promote_task(msg.task, "")); + POM_AM__set_application_bypass(false); + printf("=========================================================\n"); + printf("chint_ecn_assign 执行结束\n"); + printf("=========================================================\n"); + return ifail; +} \ No newline at end of file diff --git a/General/General/epm_handler_common.h b/General/General/epm_handler_common.h index aca5934..b3023f9 100644 --- a/General/General/epm_handler_common.h +++ b/General/General/epm_handler_common.h @@ -58,6 +58,9 @@ bool isBomViewTcm(tag_t mantr); void TCMAndOwner(tag_t matnrTop); int CHINT_yptask_complete(EPM_action_message_t msg); + +int chint_ecn_signoff(EPM_action_message_t msg); +int chint_ecn_assign(EPM_action_message_t msg); //user service end #ifdef __cplusplus } diff --git a/General/General/epm_register_handler.cpp b/General/General/epm_register_handler.cpp index a657546..2fca164 100644 --- a/General/General/epm_register_handler.cpp +++ b/General/General/epm_register_handler.cpp @@ -278,6 +278,22 @@ extern DLLAPI int USERSERVICE_custom_register_handlers(int *decision, va_list ar else { printf("Registering action handler CHINT_Assignment failed %d\n", ifail); } + //更改通知单新版excel文件签名 + ifail = EPM_register_action_handler("chint_ecn_signoff", "chint_ecn_signoff", (EPM_action_handler_t)chint_ecn_signoff); + if (ifail == 0) { + printf("Registering action handler chint_ecn_signoff successful\n"); + } + else { + printf("Registering action handler chint_ecn_signoff failed %d\n", ifail); + } + //指派变更会签节点 + ifail = EPM_register_action_handler("chint_ecn_assign", "chint_ecn_assign", (EPM_action_handler_t)chint_ecn_assign); + if (ifail == 0) { + printf("Registering action handler chint_ecn_assign successful\n"); + } + else { + printf("Registering action handler chint_ecn_assign failed %d\n", ifail); + } return ifail; @@ -307,11 +323,11 @@ extern DLLAPI int USERSERVICE_custom_register_methods(int *decision, va_list arg int status = USERSERVICE_register_method("DbomToEMethod", functionPtr, numberOfArguments, argumentList, returnValueType); if (status == ITK_ok) { - fprintf(stdout, "Registering DbomToEMethod finished\n"); + printf("Registering DbomToEMethod finished\n"); } else { - fprintf(stdout, "Registering DbomToEMethod failed %d\n", status); + printf("Registering DbomToEMethod failed %d\n", status); } MEM_free(argumentList); } @@ -327,11 +343,11 @@ extern DLLAPI int USERSERVICE_custom_register_methods(int *decision, va_list arg int status = USERSERVICE_register_method("DbomToEMethodUser", functionPtr, numberOfArguments, argumentList, returnValueType); if (status == ITK_ok) { - fprintf(stdout, "Registering DbomToEMethodUser finished\n"); + printf("Registering DbomToEMethodUser finished\n"); } else { - fprintf(stdout, "Registering DbomToEMethodUser failed %d\n", status); + printf("Registering DbomToEMethodUser failed %d\n", status); } MEM_free(argumentList); } @@ -348,11 +364,11 @@ extern DLLAPI int USERSERVICE_custom_register_methods(int *decision, va_list arg numberOfArguments, argumentList, returnValueType); if (status == ITK_ok) { - fprintf(stdout, "Registering EbomToPMethod finished\n"); + printf("Registering EbomToPMethod finished\n"); } else { - fprintf(stdout, "Registering EbomToPMethod failed %d\n", status); + printf("Registering EbomToPMethod failed %d\n", status); } MEM_free(argumentList); } @@ -369,11 +385,11 @@ extern DLLAPI int USERSERVICE_custom_register_methods(int *decision, va_list arg numberOfArguments, argumentList, returnValueType); if (status == ITK_ok) { - fprintf(stdout, "Registering CloneTempProcess finished\n"); + printf("Registering CloneTempProcess finished\n"); } else { - fprintf(stdout, "Registering CloneTempProcess failed %d\n", status); + printf("Registering CloneTempProcess failed %d\n", status); } MEM_free(argumentList); } @@ -390,11 +406,11 @@ extern DLLAPI int USERSERVICE_custom_register_methods(int *decision, va_list arg numberOfArguments, argumentList, returnValueType); if (status == ITK_ok) { - fprintf(stdout, "Registering UpdateWorkTime finished\n"); + printf("Registering UpdateWorkTime finished\n"); } else { - fprintf(stdout, "Registering UpdateWorkTime failed %d\n", status); + printf("Registering UpdateWorkTime failed %d\n", status); } MEM_free(argumentList); } @@ -411,11 +427,11 @@ extern DLLAPI int USERSERVICE_custom_register_methods(int *decision, va_list arg numberOfArguments, argumentList, returnValueType); if (status == ITK_ok) { - fprintf(stdout, "Registering AutoFeeding finished\n"); + printf("Registering AutoFeeding finished\n"); } else { - fprintf(stdout, "Registering AutoFeeding failed %d\n", status); + printf("Registering AutoFeeding failed %d\n", status); } MEM_free(argumentList); } diff --git a/General/General/epm_register_handler.h b/General/General/epm_register_handler.h index f21e4cd..99f5c6d 100644 --- a/General/General/epm_register_handler.h +++ b/General/General/epm_register_handler.h @@ -20,7 +20,7 @@ extern "C" { #endif -extern DLLAPI int USERSERVICE_custom_register_handlers(int *, va_list); +extern DLLAPI int USERSERVICE_custom_register_handlers(int* decision, va_list args); extern DLLAPI int USERSERVICE_custom_register_methods(int *decision, va_list args); extern int Register_revise_msg( void ); diff --git a/General/General/libGeneral_custom_main.cpp b/General/General/libGeneral_custom_main.cpp index a202ebe..d3fc1f3 100644 --- a/General/General/libGeneral_custom_main.cpp +++ b/General/General/libGeneral_custom_main.cpp @@ -23,9 +23,9 @@ extern "C" { DLLAPI int General_register_callbacks()//注意此处的General即dll的名称,若是写错,注册会失败 { int ifail = ITK_ok; - TC_write_syslog("*******************************************************************************\n"); - TC_write_syslog("* General_register_callbacks is starting *\n"); - TC_write_syslog("*******************************************************************************\n"); + printf("*******************************************************************************\n"); + printf("* General_register_callbacks is starting *\n"); + printf("*******************************************************************************\n"); @@ -40,13 +40,13 @@ extern "C" { //USERSERVICE_custom_register_handlers是具体的注册handler的文件 ITKCALL( ifail = CUSTOM_register_exit("General","USER_gs_shell_init_module",//注意此处的General即dll的名称,若是写错,注册会失败 (CUSTOM_EXIT_ftn_t)USERSERVICE_custom_register_handlers) ); - fprintf( stdout, "\n General registering USERSERVICE_custom_register_handlers completed!\n" ); + printf( "\n General registering USERSERVICE_custom_register_handlers completed!\n" ); ITKCALL(ifail = CUSTOM_register_exit("General", "USERSERVICE_register_methods", (CUSTOM_EXIT_ftn_t)USERSERVICE_custom_register_methods)); if (ifail == ITK_ok) { - fprintf(stdout, "USERSERVICE_register_methods 注册成功!\n"); + printf("General_register_callbacks 注册成功!\n"); } else { - fprintf(stdout, "USERSERVICE_register_methods 注册失败!\n"); + printf("General_register_callbacks 注册失败:%d\n", ifail); } diff --git a/General/General/string_utils.cxx b/General/General/string_utils.cxx index 72328ee..0bdf0ba 100644 --- a/General/General/string_utils.cxx +++ b/General/General/string_utils.cxx @@ -78,6 +78,10 @@ void Split(string strArg, string spliter, vector& ans) strArg = strArg.substr(index0 + spliter.size()); ans.push_back(one_arg); } + if (strArg.size() < 1) { + ans.push_back(strArg); + break; + } } else {