#include "tinyxml/tinyxml.h" #include "CRUL_server_call_httpserver.h" #include "SendSap.h" void sendSAP(char* url, char* data) { CURL *curl; CURLcode res; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https"); struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/xml"); if (tc_strstr(url, "192.168.0.184") != NULL || tc_strstr(url, "gfpot01") != NULL) { headers = curl_slist_append(headers, "Authorization: Basic cG9fcmZjOjFxYXohUUFa");//"po_rfc", "1qaz!QAZ" } else { headers = curl_slist_append(headers, "Authorization: Basic c2hwbG06c2FwQDIwMTk=");//"shplm", "sap@2019" } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); res = curl_easy_perform(curl); } curl_easy_cleanup(curl); } void getProcess(tag_t rev, tag_t partRev, char* now, char* groupName, map gy_meops, TiXmlElement * BOPLIST, TiXmlElement * SONLIST, int valueOf) { if (isTcm2(rev)) { return; } char *zt2_MaterialNo = NULL; ITKCALL(AOM_ask_value_string(partRev, "zt2_MaterialNo", &zt2_MaterialNo)); if (gy_meops.count(zt2_MaterialNo)) { return; } gy_meops[zt2_MaterialNo] = rev; tag_t ebom_window = NULLTAG, line = NULLTAG; ITKCALL(BOM_create_window(&ebom_window)); ITKCALL(BOM_set_window_top_line(ebom_window, NULL, rev, NULLTAG, &line)); int c_line_count = 0; tag_t *c_line_tags = NULL; ITKCALL(BOM_line_ask_all_child_lines(line, &c_line_count, &c_line_tags)); char *item_id = NULL, *item_revision_id = NULL, *object_name = NULL, *zt2_unit = NULL; ITKCALL(ITEM_ask_rev_id2(rev, &item_id)); ITKCALL(AOM_ask_value_string(rev, "item_revision_id", &item_revision_id)); ITKCALL(AOM_ask_value_string(rev, "object_name", &object_name)); string tcid = ""; tcid.append(item_id).append("/").append(item_revision_id); TiXmlElement *BOPCONTENTS = addElement(BOPLIST, "BOPCONTENTS", ""); addElement(BOPCONTENTS, "BOPTCID", tcid.c_str()); addElement(BOPCONTENTS, "BOPNAME", object_name); addElement(BOPCONTENTS, "BOPTYPE", "S1"); addElement(BOPCONTENTS, "WLBM", zt2_MaterialNo); addElement(BOPCONTENTS, "PLANT", groupName); addElement(BOPCONTENTS, "VERWE", "1"); addElement(BOPCONTENTS, "STATU", "4"); addElement(BOPCONTENTS, "DATUV", now); addElement(BOPCONTENTS, "PLNAL", "1"); addElement(BOPCONTENTS, "VERWE", tcid.c_str()); addElement(BOPCONTENTS, "OTHER1", ""); addElement(BOPCONTENTS, "OTHER2", ""); TiXmlElement *BOPFILELIST = addElement(BOPCONTENTS, "BOPFILELIST", ""); int dataset_count = 0; tag_t *datasets = NULL; ITKCALL(AOM_ask_value_tags(rev, "IMAN_specification", &dataset_count, &datasets)); vector lists2; lists2.push_back("PDF"); lists2.push_back("MS Word"); lists2.push_back("MS WordX"); lists2.push_back("MS Excel"); lists2.push_back("MS ExcelX"); for (int i = 0; i < dataset_count; i++) { char *type = NULL; ITKCALL(WSOM_ask_object_type2(datasets[i], &type)); if (find(lists2.begin(), lists2.end(), type) == lists2.end()) { char *name = NULL, *uid = NULL; ITKCALL(AOM_ask_value_string(datasets[i], "object_name", &name)); ITKCALL(POM_tag_to_uid(datasets[i], &uid)); TiXmlElement *FILECONTENTS = addElement(BOPFILELIST, "FILECONTENTS", ""); addElement(FILECONTENTS, "FILEID", item_id); addElement(FILECONTENTS, "FILENAME", name); addElement(FILECONTENTS, "FILETYPE", "文件"); addElement(FILECONTENTS, "FIILUID", uid); addElement(FILECONTENTS, "OTHER1", "OTHER1"); addElement(FILECONTENTS, "OTHER2", "OTHER2"); } } } tag_t getPRevision(tag_t rev) { char *type = NULL; ITKCALL(WSOM_ask_object_type2(rev, &type)); if (tc_strcmp(type, "Part Revision") == 0) { char *zt2_ifpbom = NULL; ITKCALL(AOM_UIF_ask_value(rev, "zt2_ifpbom", &zt2_ifpbom)); if (tc_strcmp(zt2_ifpbom, "P") == 0) { return rev; } tag_t* designs = NULL; int num = 0; ITKCALL(AOM_ask_value_tags(rev, "TC_Is_Represented_By", &num, &designs)); if (num > 0) { char *zt2_MaterialNo = NULL; ITKCALL(AOM_ask_value_string(rev, "zt2_MaterialNo", &zt2_MaterialNo)); tag_t* matnrs = NULL; num = 0; ITKCALL(AOM_ask_value_tags(designs[0], "representation_for", &num, &matnrs)); for (int i = 0; i < num; i++) { char *zt2_MaterialNo2 = NULL, *zt2_ifpbom2 = NULL; ITKCALL(AOM_ask_value_string(matnrs[i], "zt2_MaterialNo", &zt2_MaterialNo2)); ITKCALL(AOM_UIF_ask_value(matnrs[i], "zt2_ifpbom", &zt2_ifpbom2)); if (tc_strcmp(zt2_ifpbom2, "P") == 0 && tc_strcmp(zt2_MaterialNo2, zt2_MaterialNo) == 0) { tag_t item = NULLTAG, *revisions = NULL; int count = 0; ITKCALL(ITEM_ask_item_of_rev(matnrs[i], &item)); ITKCALL(AOM_ask_value_tags(item, "revision_list", &count, &revisions)); for (int j = count - 1; j >= 0; j--) { if (isTcm2(revisions[j])) { return revisions[j]; } } } } } } return rev; } TiXmlElement* addElement(TiXmlElement *PARENT, const char* name, const char* val) { TiXmlElement *CHILD = new TiXmlElement(name); PARENT->LinkEndChild(CHILD); if (tc_strlen(val) > 0) { TiXmlText *materialText = new TiXmlText(val); CHILD->LinkEndChild(materialText); } return CHILD; } void getWbsMsg(tag_t pRev, char* groupName, vector& wbsList, TiXmlElement *WBSLIST) { char *zt2_MaterialNo = NULL, *zt2_WBSNo = NULL; ITKCALL(AOM_ask_value_string(pRev, "zt2_WBSNo", &zt2_WBSNo)); if (!zt2_WBSNo || tc_strlen(zt2_WBSNo) == 0 || find(wbsList.begin(), wbsList.end(), zt2_WBSNo) == wbsList.end()) { return; } ITKCALL(AOM_ask_value_string(pRev, "zt2_MaterialNo", &zt2_MaterialNo)); TiXmlElement *WBSCONTENTS = addElement(WBSLIST, "WBSCONTENTS", ""); addElement(WBSCONTENTS, "WBS", zt2_WBSNo); addElement(WBSCONTENTS, "PLANT", groupName); addElement(WBSCONTENTS, "MATERIALNO", zt2_MaterialNo); wbsList.push_back(zt2_WBSNo); } void checkMatnr(string& errMessage, tag_t matnrRev) { char *os = NULL, *zt2_State = NULL; ITKCALL(AOM_ask_value_string(matnrRev, "object_string", &os)); ITKCALL(AOM_ask_value_string(matnrRev, "zt2_State", &zt2_State)); if (tc_strcmp(zt2_State, "封存") == 0 || tc_strcmp(zt2_State, "D1") == 0) { errMessage.append("物料:").append(os).append("已封存,无法传递SAP\n"); } char **zt2_SZFactory = NULL, **zt2_SZProcuretype = NULL, **zt2_SZSealedornot = NULL; int num1 = 0, num2 = 0, num3 = 0; ITKCALL(AOM_ask_value_strings(matnrRev, "zt2_SZFactory", &num1, &zt2_SZFactory)); ITKCALL(AOM_ask_value_strings(matnrRev, "zt2_SZProcuretype", &num2, &zt2_SZProcuretype)); ITKCALL(AOM_ask_value_strings(matnrRev, "zt2_SZSealedornot", &num3, &zt2_SZSealedornot)); boolean flag = false; for (int i = 0; i < num1; i++) { if (tc_strcmp(zt2_SZFactory[i], "M060") == 0) { flag = true; if (num2 > i && tc_strcmp(zt2_SZProcuretype[i], "/") == 0) { errMessage.append("物料:").append(os).append(" 不可用,无法传递SAP\n"); } if (num3 > i && tc_strcmp(zt2_SZSealedornot[i], "Y") == 0) { errMessage.append("物料:").append(os).append(" 已封存,无法传递SAP\n"); } } } if (!flag) { errMessage.append("物料:").append(os).append(" 没有维护物料视图,无法传递SAP\n"); } } void expandAllBomPart(tag_t pRev, tag_t line, TiXmlElement *XmlINTERGRATIONLIST, char* groupName, char* now, vector wbsList, string& errMsg, map gy_meops) { TiXmlElement *WBSLIST = XmlINTERGRATIONLIST->FirstChildElement("WBSLIST"); if (WBSLIST == NULL) { WBSLIST = addElement(XmlINTERGRATIONLIST, "WBSLIST", ""); } getWbsMsg(pRev, groupName, wbsList, WBSLIST); tag_t* tzs = NULL; int num = 0; ITKCALL(AOM_ask_value_tags(pRev, "TC_Is_Represented_By", &num, &tzs)); int c_line_count = 0; tag_t *c_line_tags = NULL; ITKCALL(BOM_line_ask_all_child_lines(line, &c_line_count, &c_line_tags)); if (c_line_count == 0) { return; } TiXmlElement *WLLIST = XmlINTERGRATIONLIST->FirstChildElement("WLLIST"); if (WLLIST == NULL) { WLLIST = addElement(XmlINTERGRATIONLIST, "WLLIST", ""); } TiXmlElement *WLCONTENTS = addElement(WLLIST, "WLCONTENTS", ""); // char *item_id = NULL, *item_revision_id = NULL, *zt2_MaterialNo = NULL, *zt2_unit = NULL; ITKCALL(ITEM_ask_rev_id2(pRev, &item_id)); ITKCALL(AOM_ask_value_string(pRev, "item_revision_id", &item_revision_id)); string tcid = ""; tcid.append(item_id).append("/").append(item_revision_id); addElement(WLCONTENTS, "TCID", tcid.c_str()); // ITKCALL(AOM_ask_value_string(pRev, "zt2_MaterialNo", &zt2_MaterialNo)); addElement(WLCONTENTS, "WLBM", zt2_MaterialNo); // TiXmlElement *BOMCONTENTS = addElement(WLCONTENTS, "BOMCONTENTS", ""); addElement(WLCONTENTS, "WLFILELIST", ""); addElement(WLCONTENTS, "BOPLIST", ""); //if (c_line_count > 0) addElement(BOMCONTENTS, "PARENTTCID", tcid.c_str()); addElement(BOMCONTENTS, "PARENTWLBM", zt2_MaterialNo); addElement(BOMCONTENTS, "PLANT", groupName); addElement(BOMCONTENTS, "DATUV", now); addElement(BOMCONTENTS, "STLAN", "1"); addElement(BOMCONTENTS, "STLAL", "1"); char *zt2_Quantity = NULL; ITKCALL(AOM_ask_value_string(pRev, "zt2_Quantity", &zt2_Quantity)); addElement(BOMCONTENTS, "QUANTITY", zt2_Quantity); tag_t item; ITKCALL(ITEM_ask_item_of_rev(pRev, &item)); ITKCALL(AOM_ask_value_string(item, "zt2_unit", &zt2_unit)); char* unit = getUnti(zt2_unit); log("str = [%s] \n", unit); addElement(BOMCONTENTS, "QUIT", zt2_unit); string maxSeq = "10"; TiXmlElement *SONLIST = addElement(BOMCONTENTS, "SONLIST", ""); for (int i = 0; i < c_line_count; i++) { tag_t c_line_tag = c_line_tags[i], designRev = NULLTAG; char *type2 = NULL; ITKCALL(AOM_ask_value_tag(c_line_tag, "bl_line_object", &designRev)); ITKCALL(WSOM_ask_object_type2(designRev, &type2)); if (tc_strcmp(type2, "ZT2_XNZJBRevision") == 0) { } TiXmlElement *SONCONTENTS = addElement(SONLIST, "SONCONTENTS", ""); tag_t rev2 = getBOMPart(c_line_tag, groupName), item2; char *item_id2 = NULL, *item_revision_id2 = NULL, *zt2_MaterialNo2 = NULL, *zt2_unit2 = NULL, *bl_sequence_no = NULL, *ZT2_Remark = NULL; ITKCALL(AOM_ask_value_string(rev2, "item_id", &item_id2)); ITKCALL(AOM_ask_value_string(rev2, "item_revision_id", &item_revision_id2)); ITKCALL(AOM_ask_value_string(rev2, "zt2_MaterialNo", &zt2_MaterialNo2)); ITKCALL(ITEM_ask_item_of_rev(rev2, &item2)); ITKCALL(AOM_ask_value_string(item2, "zt2_unit", &zt2_unit2)); ITKCALL(AOM_UIF_ask_value(c_line_tag, "bl_sequence_no", &bl_sequence_no)); ITKCALL(AOM_UIF_ask_value(c_line_tag, "ZT2_Remark", &ZT2_Remark)); checkMatnr(errMsg, rev2); string tcid2 = ""; tcid2.append(item_id2).append("/").append(item_revision_id2); addElement(SONCONTENTS, "TCID", tcid2.c_str()); addElement(SONCONTENTS, "WLBM", zt2_MaterialNo2); addElement(SONCONTENTS, "DATUV", now); char *menge = NULL;// = getZYSAPMENGE(rev2, NULLTAG, c_line_tag, false, codeRemark, errMsg); menge = (char*)MEM_alloc((16 + 1) * sizeof(char)); tc_strcpy(menge, getZYSAPMENGE(rev2, NULLTAG, c_line_tag, false, "1", errMsg)); char* unit22 = getUnti(zt2_unit2); addElement(SONCONTENTS, "QUE", menge); addElement(SONCONTENTS, "QUIT", unit22); addElement(SONCONTENTS, "SORTF", ""); addElement(SONCONTENTS, "SEQID", bl_sequence_no); addElement(SONCONTENTS, "POSTP", "L"); addElement(SONCONTENTS, "REMARK", ZT2_Remark); addElement(SONCONTENTS, "OTHER1", ""); addElement(SONCONTENTS, "OTHER2", ""); if (i == c_line_count - 1) { maxSeq = bl_sequence_no; } expandAllBomPart(rev2, c_line_tag, XmlINTERGRATIONLIST, groupName, now, wbsList, errMsg, gy_meops); } tag_t meops = getProcessTag(pRev, groupName); int valueOf = stoi(maxSeq); if (pRev != NULLTAG && meops != NULLTAG) { char *os = NULL, *pos = NULL; ITKCALL(AOM_ask_value_string(pRev, "object_string", &os)); ITKCALL(AOM_ask_value_string(meops, "object_string", &pos)); log("物料[%s]工艺信息:%s", os, pos); TiXmlElement *BOPLIST = addElement(WLCONTENTS, "BOPLIST", ""); getProcess(meops, pRev, now, groupName, gy_meops, BOPLIST, SONLIST, valueOf); } } void BomSapWh(vector ccpVector, char* projectNo, char* groupName, char* wbs, char* now, string& errMsgBuf, char*code, char* transfer, char* userName, char* projectName) { log("************** BomSapWh **************"); for (int len = 0; len < ccpVector.size(); len++) { tag_t rev = ccpVector[len]; tag_t prev = getPRevision(rev); tag_t ebom_window = NULLTAG, line = NULLTAG; ITKCALL(BOM_create_window(&ebom_window)); ITKCALL(BOM_set_window_top_line(ebom_window, NULL, prev, NULLTAG, &line)); TiXmlDocument XmlDocument; XmlDocument.Parse(""); TiXmlElement* XmlRoot = XmlDocument.RootElement(); TiXmlElement *XmlREQ = XmlRoot->FirstChildElement("Body")->FirstChildElement(); TiXmlElement *XmlINTERGRATIONLIST = new TiXmlElement("XmlINTERGRATIONLIST"); XmlREQ->LinkEndChild(XmlINTERGRATIONLIST); vector wbsList; map gy_meops; string errMsg = ""; expandAllBomPart(prev, line, XmlINTERGRATIONLIST, groupName, now, wbsList, errMsg, gy_meops); } }