#include #include #include "dfl_custom.h" #include "ocilib.h" #include #include #include #include #include #include #include #include #include #include #include "corecrt_io.h" #include "direct.h" #include #include #pragma comment(lib, "Wininet") #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #include #pragma comment(lib, "ws2_32.lib") #include using namespace std; #include #include #include "cJSON.h" #include #include #include #include "common_itk_util.h" //#include "dfl_custom.h" //#include "util.h" //#include //#include "ocilib.h" //using namespace std; extern "C" int POM_AM__set_application_bypass(logical bypass); size_t write_data(void* ptr, size_t size, size_t nmemb, void* stream) { string data((const char*)ptr, (size_t)size * nmemb); *((stringstream*)stream) << data << endl; return size * nmemb; } string GbkToUtf8(const std::string& strGbk)//传入的strGbk是GBK编码 { //gbk转unicode int len = MultiByteToWideChar(CP_ACP, 0, strGbk.c_str(), -1, NULL, 0); wchar_t* strUnicode = new wchar_t[len]; wmemset(strUnicode, 0, len); MultiByteToWideChar(CP_ACP, 0, strGbk.c_str(), -1, strUnicode, len); //unicode转UTF-8 len = WideCharToMultiByte(CP_UTF8, 0, strUnicode, -1, NULL, 0, NULL, NULL); char* strUtf8 = new char[len]; WideCharToMultiByte(CP_UTF8, 0, strUnicode, -1, strUtf8, len, NULL, NULL); std::string strTemp(strUtf8);//此时的strTemp是UTF-8编码 delete[]strUnicode; delete[]strUtf8; strUnicode = NULL; strUtf8 = NULL; return strTemp; } char* U2G(const char* utf8) { int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0); wchar_t* wstr = new wchar_t[len + 1]; memset(wstr, 0, len + 1); MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len); len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); char* str = new char[len + 1]; memset(str, 0, len + 1); WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL); if (wstr) delete[] wstr; return str; } void createDir(string dPath,string mdCommand) { if (_access(dPath.c_str(), 0) != 0) {//判断文件夹是否存在 system(mdCommand.append(dPath).c_str()); } } void Split(string strArg, string spliter, vector& ans) { ans.clear(); size_t index0; string one_arg; if (strArg.find_first_not_of(" ") == string::npos) strArg = ""; while (strArg.size() > 0) { index0 = strArg.find(spliter); if (index0 != string::npos) { one_arg = strArg.substr(0, index0); strArg = strArg.substr(index0 + spliter.size()); ans.push_back(one_arg); } else { ans.push_back(strArg); break; } } } //物料传递erp int DFL_WL_TO_SRM(char** c_sql_values, const char* flow_uid) { WriteLog("===================================\n"); WriteLog("WL to SRM begin\n"); WriteLog("===================================\n"); int ifail = ITK_ok; WriteLog("Open super privilege\n"); POM_AM__set_application_bypass(true); //流程的状态 int status1 = 2; int att_cnt = 0; tag_t root_task_tag = NULLTAG, *attachments; tag_t executor; tag_t query_tag1 = NULLTAG; char* user_uid; char dwg[] = ".dwg"; char DWG[] = ".DWG"; const char query_name_product[1][QRY_name_size_c + 1] = { "零组件版本" }; //uid转tag对象 ITK__convert_uid_to_tag(flow_uid, &root_task_tag); tag_t root = NULLTAG; EPM_ask_root_task(root_task_tag,&root); if (root_task_tag == NULLTAG || root == NULLTAG) { if (ConnServer(c_sql_values[1], c_sql_values[2], c_sql_values[0]))//"tc11","infodba","//172.16.50.40/tc11" "TC12","infodba","172.16.68.13/tc1" { WriteLog("提示:中间数据表访问失败\n"); return ifail; } else { char sql8[1024] = "\0"; sprintf(sql8, "update DFL_DRAWING_TO_SRM_TASK set status = '%s' where flowid = '%s'", "已处理", flow_uid); WriteLog("提示:sql8==%s\n", sql8); if (ExecuteSQLNoInputParam(sql8) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql8); return 1; } else { ExecuteSQLNoInputParam("commit"); } } return ifail; } if (ifail != ITK_ok) { WriteLog("this workflow is not exist!\n"); return ifail; } ITKCALL(EPM_ask_attachments(root, EPM_target_attachment, &att_cnt, &attachments)); vector items; WriteLog("att_cnt=%d\n", att_cnt); //便利流程下的对象,获取满足条件的item,并将item添加进items int index = 0; //获取ip和文件夹路径 char* tomcatIp = NULL; char* position = NULL; char* url = NULL; PREF_ask_char_value("DFL_FTP_IP", 0, &tomcatIp); PREF_ask_char_value("DFL_FTP_IP", 1, &position); PREF_ask_char_value("DFL_SRM_URL", 0, &url); char* group_name1; date_t creDate; for (int i = 0; i < att_cnt; i++) { tag_t tagt1 = NULLTAG; tagt1 = attachments[i];// char* type1; int juede = 0;//判断数据库是否连接 //获取版本下的数据集 int dataset_num = 0; tag_t* dataset_tags = NULL; ITKCALL(AOM_ask_value_string(tagt1, "object_type", &type1)); if (strcmp("T2_outsourceRevision", type1) == 0) { //判断是否存在dwg文件 //获取版本下的数据集 char* file_name = NULL; char* origin_file_name = NULL; tag_t* ref_object = NULL; int n_found = 0; //数据 char* itemId = NULL; char* objectname = NULL; char* datesetname = NULL; char* fileurl = NULL; char* revision = NULL; int released = 0; date_t createtime; char* createtime_str = NULL; date_t updatetime; char* updatetime_str = NULL; string urlCreateTime = ""; string finishtime = ""; string urlName = ""; string filePaths = ""; string zipPaths = ""; ITKCALL(AOM_ask_value_tags(tagt1, "IMAN_specification", &dataset_num, &dataset_tags)); int count = 0; //循环一遍判断有几个dwg数据集 for (int f = 0; f < dataset_num; f++) { ITKCALL(AOM_ask_value_string(dataset_tags[f], "object_name", &file_name)); if (strstr(file_name, dwg) || strstr(file_name, DWG)) { count++; } } if (count == 1) { for (int k = 0; k < dataset_num; k++) { string exportName = ""; ITKCALL(AOM_ask_value_string(dataset_tags[k], "object_name", &file_name)); if (strstr(file_name, dwg) || strstr(file_name, DWG)) { //获取数据集文件名称 ITKCALL(AOM_ask_value_string(dataset_tags[k], "current_name", &origin_file_name)); //ftp上传数据集 ITKCALL(AE_ask_dataset_named_refs(dataset_tags[k], &n_found, &ref_object)); WriteLog("n_found=%d\n", n_found); if (n_found > 0) { //存在.dwg数据集 //设置处理开始时间 if (ConnServer(c_sql_values[1], c_sql_values[2], c_sql_values[0]))//"tc11","infodba","//172.16.50.40/tc11" "TC12","infodba","172.16.68.13/tc1" { WriteLog("提示:中间数据表访问失败\n"); return ifail; } else { juede = 1; time_t curtime1; time(&curtime1); tm* nowtime1 = localtime(&curtime1); string dealBeginTime; dealBeginTime.append(std::to_string(1900 + nowtime1->tm_year)).append("-").append(std::to_string(1 + nowtime1->tm_mon)).append("-").append(std::to_string(nowtime1->tm_mday)).append(" ").append(std::to_string(nowtime1->tm_hour)).append("-").append(std::to_string(nowtime1->tm_min)).append("-").append(std::to_string(nowtime1->tm_sec)); WriteLog("提示:中间数据表访问成功\n"); char sql1[1024] = "\0"; sprintf(sql1, "update DFL_DRAWING_TO_SRM_TASK set starttime = '%s' where flowid = '%s'", dealBeginTime.c_str(), flow_uid); WriteLog("提示:sql1==%s\n", sql1); if (ExecuteSQLNoInputParam(sql1) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql1); return 1; } else { ExecuteSQLNoInputParam("commit"); } } //1.下载文件到ftp目录 time_t curtime2; time(&curtime2); tm* nowtime = localtime(&curtime2); // 输出tm结构的年月日 cout << "年: " << 1900 + nowtime->tm_year << endl; cout << "月: " << 1 + nowtime->tm_mon << endl; cout << "日: " << nowtime->tm_mday << endl; urlCreateTime.append(std::to_string(1900 + nowtime->tm_year)).append("-").append(std::to_string(1 + nowtime->tm_mon)).append("-").append(std::to_string(nowtime->tm_mday)).append(" ").append(std::to_string(nowtime->tm_hour)).append("-").append(std::to_string(nowtime->tm_min)).append("-").append(std::to_string(nowtime->tm_sec)); //拼接文件夹 年-》月-》日 //创建文件夹 string mdCommandYear = "md "; string mdCommandMonth = "md "; string mdCommandDay = "md "; //string localPath = "C:\\Siemens\\ftp\\"; string localPath = ""; string dPath = localPath.append(position).append(std::to_string(1900 + nowtime->tm_year));//文件夹年路径 WriteLog("position11111111111->%s", position); WriteLog("dPath1->%s", dPath.c_str()); //创建目录 复制文件 if (_access(dPath.c_str(), 0) != 0) {//判断年是否存在 //创建年 system(mdCommandYear.append(dPath).c_str()); } dPath.append("\\").append(std::to_string(1 + nowtime->tm_mon)); WriteLog("dPath2->%s", dPath.c_str()); if (_access(dPath.c_str(), 0) != 0) {//判断月是否存在 //创建月 system(mdCommandMonth.append(dPath).c_str()); } dPath.append("\\").append(std::to_string(nowtime->tm_mday)); WriteLog("dPath3->%s", dPath.c_str()); if (_access(dPath.c_str(), 0) != 0) {//判断日是否存在 //创建日 system(mdCommandDay.append(dPath).c_str()); //数据集文件下载该目录 IMF_export_file(ref_object[0], exportName.append(dPath).append("\\").append(origin_file_name).c_str()); } else { IMF_export_file(ref_object[0], exportName.append(dPath).append("\\").append(origin_file_name).c_str()); } //3.封装数据存入 信息写入DFL_ DRAWING_TO_SRM_DETIALS urlName.append(tomcatIp).append(std::to_string(1900 + nowtime->tm_year)).append("\\").append(std::to_string(1 + nowtime->tm_mon)).append("\\").append(std::to_string(nowtime->tm_mday)).append("\\").append(origin_file_name); ITKCALL(AOM_ask_value_string(tagt1, "item_id", &itemId)); ITKCALL(AOM_ask_value_string(tagt1, "object_name", &objectname)); ITKCALL(AOM_ask_value_string(dataset_tags[k], "object_name", &datesetname)); ITKCALL(AOM_ask_value_string(tagt1, "item_revision_id", &revision)); //发布状态 int wl_release_count = 0; tag_t* wl_release_tags = NULL; char* released_str; //获取发布状态 ITKCALL(AOM_ask_value_tags(dataset_tags[k], "release_status_list", &wl_release_count, &wl_release_tags)); WriteLog("发布=>%d", wl_release_count); if (wl_release_count > 0) { //发布状态给0,封存状态给1(T2_D),其余状态都是0,取最后一次发布的状态 tag_t released_tag = wl_release_tags[wl_release_count - 1]; ITKCALL(AOM_ask_value_string(released_tag, "object_name", &released_str)); WriteLog("released_str=%s\n", released_str); if (strcmp(released_str, "T2_D") == 0) { released = 1; } } ITKCALL(AOM_ask_value_date(dataset_tags[k], "creation_date", &createtime)); ITKCALL(DATE_date_to_string(createtime, "%Y-%m-%d %H:%M:%S", &createtime_str)); ITKCALL(AOM_ask_value_date(dataset_tags[k], "last_mod_date", &updatetime)); ITKCALL(DATE_date_to_string(updatetime, "%Y-%m-%d %H:%M:%S", &updatetime_str)); //urlcreatetime //调用sql插入数据 if (juede == 1) { char sql2[1024] = "\0"; sprintf(sql2, "insert into DFL_DRAWING_TO_SRM_DETIALS(itemid,objectname,datesetname,fileurl,revision,released,createtime,updatetime,urlcreatetime,urlstatus) values('%s','%s','%s','%s','%s',%d,'%s','%s','%s','%s')", itemId, objectname, datesetname, urlName.c_str(), revision, released, createtime_str, updatetime_str, urlCreateTime.c_str(), "未同步"); WriteLog("提示:sql2==%s\n", sql2); if (ExecuteSQLNoInputParam(sql2) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql2); return 1; } else { ExecuteSQLNoInputParam("commit"); } } //4.调用SRM接口 //拼接json cJSON* array = cJSON_CreateArray(); cJSON* data = cJSON_CreateObject(); cJSON_AddStringToObject(data, "materialCode", itemId); cJSON_AddStringToObject(data, "materialName", GbkToUtf8(objectname).c_str()); cJSON_AddStringToObject(data, "materialDrawingName", GbkToUtf8(datesetname).c_str()); cJSON_AddStringToObject(data, "fileUrl", GbkToUtf8(urlName).c_str()); cJSON_AddStringToObject(data, "version", revision); cJSON_AddStringToObject(data, "status", std::to_string(released).c_str()); cJSON_AddStringToObject(data, "createTime", createtime_str); cJSON_AddStringToObject(data, "publishTime", updatetime_str); cJSON_AddItemToArray(array, data); //发json CURL* curl; CURLcode res; curl = curl_easy_init(); if (curl) { stringstream out; curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); //curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.68/gateway/serviceApi/invoke/QZbycode/DFL-SRM-005"); 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/json"); //headers = curl_slist_append(headers, "Authorization: Basic UExNOkFmdGpzcFBQWW1DU2pNaWNROWh3U3htNDJ4eXpXUkhi"); headers = curl_slist_append(headers, "Authorization: Basic UExNOmJlMVBYVzA5NzlKZGhEYWYxUXp4NzZaY3NEdE4zU3Iy"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); //const char* data = "[{\r\n \"materialCode\": \"1\",\r\n \"materialName\": \"物料TEST001\",\r\n \"materialDrawingName\": \"图纸名称\",\r\n \"fileUrl\": \"www.baidu.com\",\r\n \"version\": \"1.1\",\r\n \"status\": \"\",\r\n \"createTime\": \"2023-11-26 11:11:10\",\r\n \"publishTime\": \"2023-11-27 11:11:10\"\r\n}]\r\n"; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out); char* json_to_char = NULL; WriteLog("JSON拼接完成\n"); /* 打印JSON对象(整条链表)的所有数据 */ json_to_char = cJSON_Print(array); //cout << "JSON:" << json_to_char << endl; WriteLog("json->%s\n", U2G(json_to_char)); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_to_char); WriteLog("9\n"); res = curl_easy_perform(curl); //设置写数据 if (res != CURLE_OK) { WriteLog("curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } else { WriteLog("====>>>>OK\n"); } long retcode = 0; CURLcode code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &retcode); WriteLog("====>>>>retcode:%d\n", retcode); if (code != CURLE_OK || retcode != 200) { WriteLog("发送数据给ERP失败\n"); return 1; } else { WriteLog("发送数据给ERP成功\n"); } string str_json = out.str(); WriteLog("return Msg===>%s\n", U2G(str_json.c_str())); //5.如果接口调用成功了 修改两张表 char* a = "同步成功"; if (strstr(U2G(str_json.c_str()), a) != NULL) {//存在 //task表 time_t curtime3; time(&curtime3); tm* nowtime3 = localtime(&curtime3); // 输出tm结构的年月日 cout << "年: " << 1900 + nowtime3->tm_year << endl; cout << "月: " << 1 + nowtime3->tm_mon << endl; cout << "日: " << nowtime3->tm_mday << endl; finishtime.append(std::to_string(1900 + nowtime3->tm_year)).append("-").append(std::to_string(1 + nowtime3->tm_mon)).append("-").append(std::to_string(nowtime3->tm_mday)).append(" ").append(std::to_string(nowtime3->tm_hour)).append("-").append(std::to_string(nowtime3->tm_min)).append("-").append(std::to_string(nowtime3->tm_sec)); char sql3[1024] = "\0"; sprintf(sql3, "update DFL_DRAWING_TO_SRM_TASK set finishtime = '%s',status = '%s' where flowid = '%s'", finishtime.c_str(), "已推送", flow_uid); WriteLog("提示:sql3==%s\n", sql3); if (ExecuteSQLNoInputParam(sql3) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql3); return 1; } else { ExecuteSQLNoInputParam("commit"); } //detail表 char sql4[1024] = "\0"; sprintf(sql4, "update DFL_DRAWING_TO_SRM_DETIALS set urlstatus = '%s' where itemid = '%s' and revision = '%s'", "已同步", itemId, revision); WriteLog("提示:sql4==%s\n", sql4); if (ExecuteSQLNoInputParam(sql4) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql4); return 1; } else { ExecuteSQLNoInputParam("commit"); } } else { char sql5[1024] = "\0"; sprintf(sql5, "update DFL_DRAWING_TO_SRM_DETIALS set urlstatus = '%s' where itemid = '%s' and revision = '%s'", "同步失败", itemId, revision); WriteLog("提示:sql5==%s\n", sql5); if (ExecuteSQLNoInputParam(sql5) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql5); return 1; } else { ExecuteSQLNoInputParam("commit"); } } } curl_easy_cleanup(curl); } } } } else if(count > 1){ for (int k = 0; k < dataset_num; k++) { string exportName = ""; ITKCALL(AOM_ask_value_string(dataset_tags[k], "object_name", &file_name)); if (strstr(file_name, dwg) || strstr(file_name, DWG)) { //获取数据集文件名称 ITKCALL(AOM_ask_value_string(dataset_tags[k], "current_name", &origin_file_name)); //ftp上传数据集 ITKCALL(AE_ask_dataset_named_refs(dataset_tags[k], &n_found, &ref_object)); WriteLog("n_found=%d\n", n_found); if (n_found > 0) { //存在.dwg数据集 //设置处理开始时间 if (ConnServer(c_sql_values[1], c_sql_values[2], c_sql_values[0]))//"tc11","infodba","//172.16.50.40/tc11" "TC12","infodba","172.16.68.13/tc1" { WriteLog("提示:中间数据表访问失败\n"); return ifail; } else { juede = 1; time_t curtime1; time(&curtime1); tm* nowtime1 = localtime(&curtime1); string dealBeginTime; dealBeginTime.append(std::to_string(1900 + nowtime1->tm_year)).append("-").append(std::to_string(1 + nowtime1->tm_mon)).append("-").append(std::to_string(nowtime1->tm_mday)).append(" ").append(std::to_string(nowtime1->tm_hour)).append("-").append(std::to_string(nowtime1->tm_min)).append("-").append(std::to_string(nowtime1->tm_sec)); WriteLog("提示:中间数据表访问成功\n"); char sql1[1024] = "\0"; sprintf(sql1, "update DFL_DRAWING_TO_SRM_TASK set starttime = '%s' where flowid = '%s'", dealBeginTime.c_str(), flow_uid); WriteLog("提示:sql1==%s\n", sql1); if (ExecuteSQLNoInputParam(sql1) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql1); return 1; } else { ExecuteSQLNoInputParam("commit"); } } //1.下载文件到ftp目录 time_t curtime2; time(&curtime2); tm* nowtime = localtime(&curtime2); // 输出tm结构的年月日 cout << "年: " << 1900 + nowtime->tm_year << endl; cout << "月: " << 1 + nowtime->tm_mon << endl; cout << "日: " << nowtime->tm_mday << endl; urlCreateTime.append(std::to_string(1900 + nowtime->tm_year)).append("-").append(std::to_string(1 + nowtime->tm_mon)).append("-").append(std::to_string(nowtime->tm_mday)).append(" ").append(std::to_string(nowtime->tm_hour)).append("-").append(std::to_string(nowtime->tm_min)).append("-").append(std::to_string(nowtime->tm_sec)); //拼接文件夹 年-》月-》日 //创建文件夹 string mdCommandYear = "md "; string mdCommandMonth = "md "; string mdCommandDay = "md "; //string localPath = "C:\\Siemens\\ftp\\"; string localPath = ""; string dPath = localPath.append(position).append(std::to_string(1900 + nowtime->tm_year));//文件夹年路径 WriteLog("position11111111111->%s", position); WriteLog("dPath1->%s", dPath.c_str()); //创建目录 复制文件 if (_access(dPath.c_str(), 0) != 0) {//判断年是否存在 //创建年 system(mdCommandYear.append(dPath).c_str()); } dPath.append("\\").append(std::to_string(1 + nowtime->tm_mon)); WriteLog("dPath2->%s", dPath.c_str()); if (_access(dPath.c_str(), 0) != 0) {//判断月是否存在 //创建月 system(mdCommandMonth.append(dPath).c_str()); } dPath.append("\\").append(std::to_string(nowtime->tm_mday)); WriteLog("dPath3->%s", dPath.c_str()); if (_access(dPath.c_str(), 0) != 0) {//判断日是否存在 //创建日 system(mdCommandDay.append(dPath).c_str()); //数据集文件下载该目录 IMF_export_file(ref_object[0], exportName.append(dPath).append("\\").append(origin_file_name).c_str()); } else { IMF_export_file(ref_object[0], exportName.append(dPath).append("\\").append(origin_file_name).c_str()); } filePaths.append(exportName).append(";"); //3.封装数据存入 信息写入DFL_ DRAWING_TO_SRM_DETIALS ITKCALL(AOM_ask_value_string(tagt1, "item_id", &itemId)); ITKCALL(AOM_ask_value_string(tagt1, "object_name", &objectname)); ITKCALL(AOM_ask_value_string(dataset_tags[k], "object_name", &datesetname)); ITKCALL(AOM_ask_value_string(tagt1, "item_revision_id", &revision)); if (urlName.size() == 0) { urlName.append(tomcatIp).append(std::to_string(1900 + nowtime->tm_year)).append("\\").append(std::to_string(1 + nowtime->tm_mon)).append("\\").append(std::to_string(nowtime->tm_mday)).append("\\"); zipPaths.append(dPath).append("\\").append(itemId).append("-").append(objectname).append(".zip"); } //发布状态 int wl_release_count = 0; tag_t* wl_release_tags = NULL; char* released_str; //获取发布状态 ITKCALL(AOM_ask_value_tags(dataset_tags[k], "release_status_list", &wl_release_count, &wl_release_tags)); WriteLog("发布=>%d", wl_release_count); if (wl_release_count > 0) { //发布状态给0,封存状态给1(T2_D),其余状态都是0,取最后一次发布的状态 tag_t released_tag = wl_release_tags[wl_release_count - 1]; ITKCALL(AOM_ask_value_string(released_tag, "object_name", &released_str)); WriteLog("released_str=%s\n", released_str); if (strcmp(released_str, "T2_D") == 0) { released = 1; } } ITKCALL(AOM_ask_value_date(dataset_tags[k], "creation_date", &createtime)); ITKCALL(DATE_date_to_string(createtime, "%Y-%m-%d %H:%M:%S", &createtime_str)); ITKCALL(AOM_ask_value_date(dataset_tags[k], "last_mod_date", &updatetime)); ITKCALL(DATE_date_to_string(updatetime, "%Y-%m-%d %H:%M:%S", &updatetime_str)); //urlcreatetime } } } //调用jar包生成zip WriteLog("提示:filePaths.c_str()==%s\n", filePaths.c_str()); char cmd[256] = ""; char* tc_root_dir = getenv("tc_root"); strcpy(cmd, "java -jar "); strcat(cmd, tc_root_dir); strcat(cmd, "\\bin\\DFL_ZIP.jar"); strcat(cmd, " \""); strcat(cmd, filePaths.c_str()); strcat(cmd, "\" \""); strcat(cmd, zipPaths.c_str()); strcat(cmd, "\""); WriteLog("\n%s\n", cmd); system(cmd); //调用sql插入数据 urlName.append(itemId).append("-").append(objectname).append(".zip"); if (juede == 1) { char sql2[1024] = "\0"; sprintf(sql2, "insert into DFL_DRAWING_TO_SRM_DETIALS(itemid,objectname,datesetname,fileurl,revision,released,createtime,updatetime,urlcreatetime,urlstatus) values('%s','%s','%s','%s','%s',%d,'%s','%s','%s','%s')", itemId, objectname, datesetname, urlName.c_str(), revision, released, createtime_str, updatetime_str, urlCreateTime.c_str(), "未同步"); WriteLog("提示:sql2==%s\n", sql2); if (ExecuteSQLNoInputParam(sql2) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql2); return 1; } else { ExecuteSQLNoInputParam("commit"); } } //4.调用SRM接口 //拼接json cJSON* array = cJSON_CreateArray(); cJSON* data = cJSON_CreateObject(); cJSON_AddStringToObject(data, "materialCode", itemId); cJSON_AddStringToObject(data, "materialName", GbkToUtf8(objectname).c_str()); cJSON_AddStringToObject(data, "materialDrawingName", GbkToUtf8(datesetname).c_str()); cJSON_AddStringToObject(data, "fileUrl", GbkToUtf8(urlName).c_str()); cJSON_AddStringToObject(data, "version", revision); cJSON_AddStringToObject(data, "status", std::to_string(released).c_str()); cJSON_AddStringToObject(data, "createTime", createtime_str); cJSON_AddStringToObject(data, "publishTime", updatetime_str); cJSON_AddItemToArray(array, data); //发json CURL* curl; CURLcode res; curl = curl_easy_init(); if (curl) { stringstream out; curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); //curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.68/gateway/serviceApi/invoke/QZbycode/DFL-SRM-005"); 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/json"); //headers = curl_slist_append(headers, "Authorization: Basic UExNOkFmdGpzcFBQWW1DU2pNaWNROWh3U3htNDJ4eXpXUkhi"); headers = curl_slist_append(headers, "Authorization: Basic UExNOmJlMVBYVzA5NzlKZGhEYWYxUXp4NzZaY3NEdE4zU3Iy"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); //const char* data = "[{\r\n \"materialCode\": \"1\",\r\n \"materialName\": \"物料TEST001\",\r\n \"materialDrawingName\": \"图纸名称\",\r\n \"fileUrl\": \"www.baidu.com\",\r\n \"version\": \"1.1\",\r\n \"status\": \"\",\r\n \"createTime\": \"2023-11-26 11:11:10\",\r\n \"publishTime\": \"2023-11-27 11:11:10\"\r\n}]\r\n"; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out); char* json_to_char = NULL; WriteLog("JSON拼接完成\n"); /* 打印JSON对象(整条链表)的所有数据 */ json_to_char = cJSON_Print(array); //cout << "JSON:" << json_to_char << endl; WriteLog("json->%s\n", U2G(json_to_char)); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_to_char); WriteLog("9\n"); res = curl_easy_perform(curl); //设置写数据 if (res != CURLE_OK) { WriteLog("curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } else { WriteLog("====>>>>OK\n"); } long retcode = 0; CURLcode code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &retcode); WriteLog("====>>>>retcode:%d\n", retcode); if (code != CURLE_OK || retcode != 200) { WriteLog("发送数据给ERP失败\n"); return 1; } else { WriteLog("发送数据给ERP成功\n"); } string str_json = out.str(); WriteLog("return Msg===>%s\n", U2G(str_json.c_str())); //5.如果接口调用成功了 修改两张表 char* a = "同步成功"; if (strstr(U2G(str_json.c_str()), a) != NULL) {//存在 //task表 time_t curtime3; time(&curtime3); tm* nowtime3 = localtime(&curtime3); // 输出tm结构的年月日 cout << "年: " << 1900 + nowtime3->tm_year << endl; cout << "月: " << 1 + nowtime3->tm_mon << endl; cout << "日: " << nowtime3->tm_mday << endl; finishtime.append(std::to_string(1900 + nowtime3->tm_year)).append("-").append(std::to_string(1 + nowtime3->tm_mon)).append("-").append(std::to_string(nowtime3->tm_mday)).append(" ").append(std::to_string(nowtime3->tm_hour)).append("-").append(std::to_string(nowtime3->tm_min)).append("-").append(std::to_string(nowtime3->tm_sec)); char sql3[1024] = "\0"; sprintf(sql3, "update DFL_DRAWING_TO_SRM_TASK set finishtime = '%s',status = '%s' where flowid = '%s'", finishtime.c_str(), "已推送", flow_uid); WriteLog("提示:sql3==%s\n", sql3); if (ExecuteSQLNoInputParam(sql3) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql3); return 1; } else { ExecuteSQLNoInputParam("commit"); } //detail表 char sql4[1024] = "\0"; sprintf(sql4, "update DFL_DRAWING_TO_SRM_DETIALS set urlstatus = '%s' where itemid = '%s' and revision = '%s'", "已同步", itemId, revision); WriteLog("提示:sql4==%s\n", sql4); if (ExecuteSQLNoInputParam(sql4) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql4); return 1; } else { ExecuteSQLNoInputParam("commit"); } } else { char sql5[1024] = "\0"; sprintf(sql5, "update DFL_DRAWING_TO_SRM_DETIALS set urlstatus = '%s' where itemid = '%s' and revision = '%s'", "同步失败", itemId, revision); WriteLog("提示:sql5==%s\n", sql5); if (ExecuteSQLNoInputParam(sql5) == -1) { WriteLog("提示:数据插入 失败, %s \n", sql5); return 1; } else { ExecuteSQLNoInputParam("commit"); } } } curl_easy_cleanup(curl); } } } POM_AM__set_application_bypass(false); WriteLog("===================================\n"); WriteLog("WL to SRM end\n"); WriteLog("===================================\n"); return ifail; } int ITK_user_main(int argc, char* argv[]) { char* log_file = NULL; printf("创建日志文件\n"); char* TO_SRM = (char*)malloc(sizeof("TO_SRM")); strcpy(TO_SRM, "TO_SRM"); CreateLogFile(TO_SRM, &log_file); int ifail = ITK_ok; int len; int outputValueCount; char* pbuf = NULL; char* tc_name, *tc_pwd, *tc_group; int c_sql_value_count = 0; char** option_values; tc_name = ITK_ask_cli_argument("-u="); tc_pwd = ITK_ask_cli_argument("-p="); tc_group = ITK_ask_cli_argument("-g="); const char* flowuid = NULL; const char* user_id = NULL; char*** flowUID_values=NULL; WriteLog("name= %s\n", tc_name); WriteLog("pwd= %s\n", tc_pwd); WriteLog("group= %s\n", tc_group); ifail = TC_init_module(tc_name, tc_pwd, tc_group); if (ifail != ITK_ok) { WriteLog("login fail! \n"); return ifail; } else { WriteLog("login>>>>> \n"); } //获取首选项的值 ITKCALL(PREF_ask_char_values("DFL2_SQL_Connect2", &c_sql_value_count, &option_values)); if (c_sql_value_count != 3) { WriteLog("The preferences are incorrectly configured!\n"); return 0; } WriteLog("===================================\n"); WriteLog("get flowUID begin\n"); WriteLog("===================================\n"); int outputColumn = 0; if (ConnServer(option_values[1], option_values[2], option_values[0]))//"tc11","infodba","//172.16.50.40/tc11" "TC12","infodba","172.16.68.13/tc1" { WriteLog("Info: Failed to access the data table\n"); return NULL; } else { WriteLog("Info: The data table is accessed successfully\n"); char sql_cx[1024] = "\0"; sprintf(sql_cx, "select flowid from DFL_DRAWING_TO_SRM_TASK where STATUS ='未开始'ORDER BY CODE DESC"); WriteLog("Tip: Process UID query started\n"); WriteLog("Info:sql==%s\n", sql_cx); if (QuerySQLNoInputParam(sql_cx, &outputColumn, &outputValueCount, &flowUID_values) == -1) { WriteLog("Info: Failed to query the process UID. %s \n", sql_cx); return NULL; } if (outputValueCount <= 0) { WriteLog("Info:Workflow data was not queried!\n"); DisConnServer(); return NULL; } WriteLog("Info: The process UID query is complete!\n"); WriteLog("outputValueCount=%d\n", outputValueCount); WriteLog("outputColumn=%d\n", outputColumn); WriteLog("===================================\n"); WriteLog("get flowUID end\n"); WriteLog("===================================\n"); } for (int k = 0; k < outputValueCount; k++) { flowuid = flowUID_values[k][0]; WriteLog("flowUID is:%s\n", flowuid); ifail = DFL_WL_TO_SRM(option_values, flowuid); } DisConnServer(); CloseLog(); return ifail; }