|
|
#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,封存状态给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;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|