You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

863 lines
33 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <iostream>
#include <vector>
#include "dfl_custom.h"
#include "ocilib.h"
#include <unidefs.h>
#include <tc/preferences.h>
#include <ics/ics.h>
#include <ics/ics2.h>
#include <tc/tc_macros.h>
#include <tccore/aom_prop.h>
#include <tccore/aom.h>
#include <time.h>
#include <base_utils/TcResultStatus.hxx>
#include <base_utils/IFail.hxx>
#include "corecrt_io.h"
#include "direct.h"
#include <ae/ae.h>
#include <wininet.h>
#pragma comment(lib, "Wininet")
#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
#include <experimental\filesystem>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;
#include <ctime>
#include <fclasses/tc_date.h>
#include "cJSON.h"
#include <curl\curl.h>
#include <sstream>
#include <iostream>
#include "common_itk_util.h"
//#include "dfl_custom.h"
//#include "util.h"
//#include <ics/ics2.h>
//#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<string>& 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<WL_ITEM> 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封存状态给1T2_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封存状态给1T2_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;
}