#include"kutil.h" #include #include #include #include #include "libxl.h" #include #include #include #include #include #include #include #include #include #include #include #include "libxl.h" #include #include #include #include using namespace libxl; using namespace std::chrono_literals; using namespace std; #define debug true #define ITK_err 919012 std::string generateJsonString2(char* MATNR, char* FLAG,char * MATEREV,char * ZXPLC) { // 拼接JSON字符串 std::string jsonString = "[\n"; jsonString += " {\n"; jsonString += " \"MATNR\":\""; jsonString += MATNR; jsonString += "\",\n"; jsonString += " \"MATEREV\":\""; jsonString += MATEREV; jsonString += "\",\n"; jsonString += " \"ZXPLC\":\""; jsonString += ZXPLC; jsonString += "\",\n"; jsonString += " \"FLAG\":\""; jsonString += FLAG; jsonString += "\"\n"; jsonString += " }\n"; jsonString += "]"; // 返回JSON字符串 return jsonString; } // 转义json字符串 void escapeJson1(std::string& str) { int len = str.length(); int newLen = len; for (int i = 0; i < len; i++) { if (str[i] == '"' || str[i] == '\\') { newLen++; } } std::string escapedStr; escapedStr.reserve(newLen); for (int i = 0; i < len; i++) { if (str[i] == '"' || str[i] == '\\') { escapedStr.push_back('\\'); } escapedStr.push_back(str[i]); } str = escapedStr; } /** * * @handlerName: LD_PartChange * @Description: 物料状态解冻\冻结同步接口,1. 用户通过流程触发将物料状态解冻\冻结状态传递给MES和SAP * @change 增加接口字段传递 MATEREV字段需要获取-type参数中指定版本上的item_revision_id属性值 ZXPLC字段获取-type参数中指定版本上的ld6_ifNewProduct,如未找到此属性,则传递“常规" * @changeDate 2024/1/23 * @author hcj */ int LD_PartChange(EPM_action_message_t msg) { printf("开始执行"); int att_cnt = 0; int doc_num = 0; tag_t rootTask_tag = NULLTAG; tag_t task = NULLTAG; tag_t* attachments = NULLTAG; tag_t* doc_tags = NULLTAG; string error; char* arg = NULL, * argflag = NULL, * argvalue = NULL; int arg_cnt = TC_number_of_arguments(msg.arguments); char * FLAG = NULL, * type = NULL; task = msg.task; string erro2 = ""; string erro = ""; int send1 = 0; int send2 = 0; ITKCALL(EPM_ask_root_task(task, &rootTask_tag)); if (arg_cnt > 0) { for (int i = 0; i < arg_cnt; i++) { arg = TC_next_argument(msg.arguments); ITKCALL(ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue)); if (strcmp(argflag, "FLAG") == 0) { if (argvalue != NULL) { printf("获取的值%s:\n", argvalue); FLAG = argvalue; } } if (strcmp(argflag, "type") == 0) { if (argvalue != NULL) { printf("获取的值%s:\n", argvalue); type = argvalue; } } } //获取流程下目标关系下的对象 printf("获取流程下目标关系下的对象"); ITKCALL(EPM_ask_attachments(rootTask_tag, EPM_target_attachment, &doc_num, &doc_tags)); for (int i = 0; i < doc_num; i++) { char* objtype = NULL; ITKCALL(AOM_ask_value_string(doc_tags[i], "object_type", &objtype)); if (strstr(type, objtype) != nullptr) { //获取物料编码 char* MATNR = NULL; char* MATEREV = NULL; char* ZXPLC = "常规"; ITKCALL(AOM_ask_value_string(doc_tags[i], "item_id", &MATNR)); ITKCALL(AOM_ask_value_string(doc_tags[i], "item_revision_id", &MATEREV)); try { AOM_ask_value_string(doc_tags[i], "ld6_ifNewProduct", &ZXPLC); } catch (const std::exception& e) { printf("没有获取到属性值ld6_ifNewProduct\n"); } //获取首选项的值 char* url = NULL; PREF_ask_char_value("LD_PLM2MES_PartChange_Config", 0, &url); //获取要发送的json字符串 std::string jsonString = generateJsonString2(MATNR, FLAG, MATEREV, ZXPLC); printf("jsonString:%s\n", jsonString.c_str()); std::regex regex("\\s+"); std::string result = std::regex_replace(jsonString, regex, ""); // 转义处理后的json字符串 escapeJson1(result); //调用jar包向接口发送数据 printf("开始执行cmd方法"); char cmd[1024] = ""; strcpy(cmd, "java -jar D:\\Siemens\\Teamcenter13\\bin\\sapjco3.jar"); strcat(cmd, " "); strcat(cmd, " "); strcat(cmd, url); strcat(cmd, " "); strcat(cmd, result.c_str()); strcat(cmd, " "); strcat(cmd, "2"); printf("\n%s\n", cmd); system(cmd); //读取本地文件获取执行结果 //读取本地的result文件(SAP) string id = MATNR; string SAPfile = "D:\\TCTOSAP\\" + id + "result.txt"; std::ifstream file(SAPfile); if (!file.is_open()) { std::cerr << "Failed to open file!" << std::endl; char* error = "SAP服务未响应"; EMH_store_error_s1(EMH_severity_error, EMH_AE_error_base,error); //EMH_store_error_s2(EMH_severity_error, ITK_err, "提示", error); return 1; } else { std::stringstream buffer1; buffer1 << file.rdbuf(); std::string resultStr = buffer1.str(); printf("返回的值%s:\n", resultStr.c_str()); AOM_lock(doc_tags[i]); if (strcmp(resultStr.c_str(), "同步成功") == 0) { ITKCALL(AOM_set_value_string(doc_tags[i], "ld6_partiffrozentosap", "成功")); } else { //EMH_store_error_s2(EMH_severity_error, ITK_err, "提示", resultStr.c_str()); ITKCALL(AOM_set_value_string(doc_tags[i], "ld6_partiffrozentosap", "失败")); erro = erro + resultStr; } AOM_save(doc_tags[i]); AOM_unlock(doc_tags[i]); AOM_refresh(doc_tags[i], true); } //清空result文件的信息 std::ofstream file8(SAPfile, std::ios::trunc); // 打开文件并设置为写入模式,使用 trunc 模式会清空文件内容 if (!file8) { //删除result文件C:\TCTOLIMS remove(SAPfile.c_str()); } else { //删除result文件C:\TCTOLIMS remove(SAPfile.c_str()); file8.close(); // 关闭文件流 } //读取本地的result文件(MAS) string MASpath = "D:\\TCTOMAS\\" + id + "result.txt"; std::ifstream file1(MASpath); if (!file1.is_open()) { std::cerr << "Failed to open file!" << std::endl; char* error = "MES服务未响应"; EMH_store_error_s1(EMH_severity_error, EMH_AE_error_base, error); //EMH_store_error_s2(EMH_severity_error, ITK_err, "提示", error); return 1; } else { std::stringstream buffer1; buffer1 << file1.rdbuf(); std::string resultStr = buffer1.str(); printf("返回的值%s:\n", resultStr.c_str()); if (strcmp(resultStr.c_str(), "保存成功") == 0) { ITKCALL(AOM_set_value_string(doc_tags[i], "ld6_partiffrozentomes", "成功")); } else{ erro2 = erro2 + resultStr; ITKCALL(AOM_set_value_string(doc_tags[i], "ld6_partiffrozentomes", "失败")); send2++; } AOM_save(doc_tags[i]); AOM_unlock(doc_tags[i]); AOM_refresh(doc_tags[i], true); //清空删除文件 //清空result文件的信息 std::ofstream file2(MASpath, std::ios::trunc); // 打开文件并设置为写入模式,使用 trunc 模式会清空文件内容 if (!file2) { //删除result文件C:\TCTOLIMS remove(MASpath.c_str()); } else { //删除result文件C:\TCTOLIMS remove(MASpath.c_str()); file2.close(); // 关闭文件流 } } } } //去掉最后一个逗号 if (!strcmp(erro.c_str(), "") == 0) { size_t lastCommaPos = erro.find_last_of(','); if (lastCommaPos != std::string::npos) { erro = erro.substr(0, lastCommaPos); } } if (send1 > 0 && send2 > 0) { string senderror = "错误信息:发送SAP" + erro + ",发送MES" + erro2; EMH_store_error_s1(EMH_severity_error, EMH_AE_error_base, senderror.c_str()); //EMH_store_error_s2(EMH_severity_error, ITK_err, "提示", senderror.c_str()); return 1; } else if (send1 > 0 && send2 == 0) { string senderror = "错误信息:发送SAP" + erro; EMH_store_error_s1(EMH_severity_error, EMH_AE_error_base, senderror.c_str()); //EMH_store_error_s2(EMH_severity_error, ITK_err, "提示", senderror.c_str()); return 1; } else if (send1 == 0 && send2 > 0) { string senderror = "错误信息:发送MES" + erro2; EMH_store_error_s1(EMH_severity_error, EMH_AE_error_base, senderror.c_str()); //EMH_store_error_s2(EMH_severity_error, ITK_err, "提示", senderror.c_str()); return 1; } } return 0; }