diff --git a/.vs/DFL_WL_BOM_TOSRM/v16/.suo b/.vs/DFL_WL_BOM_TOSRM/v16/.suo
index a9c5e30..d5b1776 100644
Binary files a/.vs/DFL_WL_BOM_TOSRM/v16/.suo and b/.vs/DFL_WL_BOM_TOSRM/v16/.suo differ
diff --git a/.vs/DFL_WL_BOM_TOSRM/v16/Browse.VC.db b/.vs/DFL_WL_BOM_TOSRM/v16/Browse.VC.db
index c05637d..64e43dc 100644
Binary files a/.vs/DFL_WL_BOM_TOSRM/v16/Browse.VC.db and b/.vs/DFL_WL_BOM_TOSRM/v16/Browse.VC.db differ
diff --git a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/19f56483ff14927e/DFL_WL_BOM_TOSRM.ipch b/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/19f56483ff14927e/DFL_WL_BOM_TOSRM.ipch
deleted file mode 100644
index 58fd352..0000000
Binary files a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/19f56483ff14927e/DFL_WL_BOM_TOSRM.ipch and /dev/null differ
diff --git a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/c47bf696d93ffdde/COMMON_ITK_UTIL.ipch b/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/c47bf696d93ffdde/COMMON_ITK_UTIL.ipch
deleted file mode 100644
index 3c3a479..0000000
Binary files a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/c47bf696d93ffdde/COMMON_ITK_UTIL.ipch and /dev/null differ
diff --git a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/df822c026b0f7b41/WTYPESBASE.ipch b/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/df822c026b0f7b41/WTYPESBASE.ipch
deleted file mode 100644
index d2bcc50..0000000
Binary files a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/df822c026b0f7b41/WTYPESBASE.ipch and /dev/null differ
diff --git a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/ea35185c947d304f/TC_LOG.ipch b/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/ea35185c947d304f/TC_LOG.ipch
deleted file mode 100644
index 3f0e2fd..0000000
Binary files a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/ea35185c947d304f/TC_LOG.ipch and /dev/null differ
diff --git a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/ea49433211dd9158/CONNOR_ITK_UTIL.ipch b/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/ea49433211dd9158/CONNOR_ITK_UTIL.ipch
deleted file mode 100644
index 2bdc99e..0000000
Binary files a/.vs/DFL_WL_BOM_TOSRM/v16/ipch/AutoPCH/ea49433211dd9158/CONNOR_ITK_UTIL.ipch and /dev/null differ
diff --git a/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOERP.vcxproj b/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOERP.vcxproj
index fbcd31b..0d134cc 100644
--- a/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOERP.vcxproj
+++ b/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOERP.vcxproj
@@ -23,7 +23,7 @@
{80658E28-1D8D-406B-B96C-6F8B3009168B}
Win32Proj
DFLWLBOMTOERP
- 10.0.19041.0
+ 10.0
DFL_WL_BOM_TOSRM
@@ -82,6 +82,7 @@
false
+ BH_BOM_TOCAPP
@@ -144,7 +145,7 @@
true
NDEBUG;_CONSOLE;IPLIB=none;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)
false
- D:\Clibs\12\include;D:\Clibs\12\include_cpp;D:\Clibs\12\OCI\include;%(AdditionalIncludeDirectories)
+ C:\environment\Teamcenter-ENV\ITK_Configuration_File\tc12ITK\tc12ITK\dflittk\include;C:\environment\Teamcenter-ENV\ITK_Configuration_File\tc12ITK\tc12ITK\dflittk\include_cpp;C:\environment\Teamcenter-ENV\ITK_Configuration_File\tc12ITK\tc12ITK\dflittk\oci\include;C:\environment\aws-sdk-cpp-1.0.164\aws-cpp-sdk-core\include;C:\environment\aws-sdk-cpp-1.0.164\aws-cpp-sdk-s3\include;%(AdditionalIncludeDirectories)
/D _CRT_SECURE_NO_WARNINGS %(AdditionalOptions)
@@ -152,21 +153,154 @@
true
true
true
- D:\项目\东富龙\东富龙\lib\*.lib;D:\Clibs\12\lib\*.lib;D:\Clibs\12\lib\itk_main.obj;%(AdditionalDependencies)
+ C:\environment\Teamcenter-ENV\ITK_Configuration_File\tc12ITK\tc12ITK\dflittk\lib\*.lib;C:\environment\Teamcenter-ENV\ITK_Configuration_File\tc12ITK\tc12ITK\dflittk\lib\itk_main.obj;%(AdditionalDependencies)
libuser_exits.ar.lib;%(IgnoreSpecificDefaultLibraries)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOERP.vcxproj.filters b/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOERP.vcxproj.filters
index ecb8b02..9c82c74 100644
--- a/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOERP.vcxproj.filters
+++ b/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOERP.vcxproj.filters
@@ -13,6 +13,96 @@
{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+ {0c1340d0-0fb3-4d39-8855-f917502d2710}
+
+
+ {7aadf2ef-ddb6-4765-8482-ae989132d6c0}
+
+
+ {7bb560ab-2f66-4d4a-a6ae-3fe4fbdc764c}
+
+
+ {f12da17c-8886-4226-80df-0e6b0e14aee4}
+
+
+ {41f7e9ad-b635-4e4f-b62f-8b9bfd4bbfba}
+
+
+ {145f3644-48ea-423a-9196-d10997434be2}
+
+
+ {8ba764ba-4195-4baf-bf79-955d6a7d0253}
+
+
+ {0a350c3a-5f81-4143-9416-624be15e45b3}
+
+
+ {2be274bb-b31f-42dd-9092-73c830689087}
+
+
+ {6635bc27-2d20-48fc-89a4-f11e6419a6b0}
+
+
+ {273dd550-31ee-4992-a61b-c63f5db6370c}
+
+
+ {f1cab352-e5c9-4a79-831e-3eb8b9761b98}
+
+
+ {a4586207-c4a9-4101-a666-74508c4bad60}
+
+
+ {0b9f3493-de0a-40fe-b8fa-c43c37d922fb}
+
+
+ {5a81b3ce-8d10-420e-a124-db82fc034746}
+
+
+ {679456e1-77d3-4a46-bc85-6503ebcc9e0d}
+
+
+ {25a04671-aff5-4bc3-b4f3-3693dd988912}
+
+
+ {8971b66d-e402-4eec-b000-cb2102acf8bf}
+
+
+ {50128eb1-0962-4b3b-bdd8-bd3bebb77588}
+
+
+ {c8306670-f139-4fe2-aeaa-5a6508385fe8}
+
+
+ {04c963c8-0dbe-49de-b008-20526a629c4f}
+
+
+ {05e0d21b-ea01-44c9-b218-c0e954d0671a}
+
+
+ {be2c0615-bd5d-45b7-b879-297e53b4f440}
+
+
+ {4d5883b3-20f7-4c9c-85b1-f9f784bb4a56}
+
+
+ {00e1351b-9b0f-4c9f-b710-1bc701aed61c}
+
+
+ {3eceb7d0-8f2d-4c69-9ff1-ce9135fbd207}
+
+
+ {e1b6f0bb-3065-4776-9ed5-2e5367606870}
+
+
+ {cc983c02-b0e7-45ea-9333-1e35900c9dd2}
+
+
+ {935f3bd0-95a6-43df-9f3a-36f377fde53a}
+
+
+ {4e6d50af-147a-4349-890a-3dfcc65e8170}
+
@@ -27,6 +117,15 @@
头文件
+
+ 头文件
+
+
+ 头文件
+
+
+ 头文件
+
@@ -41,5 +140,387 @@
头文件
+
+ 头文件
+
+
+ 头文件
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core\auth
+
+
+ 头文件\aws\core\auth
+
+
+ 头文件\aws\core\auth
+
+
+ 头文件
+
+
+ 头文件\aws\core\client
+
+
+ 头文件\aws\core\client
+
+
+ 头文件\aws\core\client
+
+
+ 头文件\aws\core\client
+
+
+ 头文件\aws\core\client
+
+
+ 头文件\aws\core\client
+
+
+ 头文件\aws\core\client
+
+
+ 头文件\aws\core\client
+
+
+ 头文件\aws\core\config
+
+
+ 头文件\aws\core\external\json-cpp
+
+
+ 头文件\aws\core\external\tinyxml2
+
+
+ 头文件\aws\core\http
+
+
+ 头文件\aws\core\http
+
+
+ 头文件\aws\core\http
+
+
+ 头文件\aws\core\http
+
+
+ 头文件\aws\core\http
+
+
+ 头文件\aws\core\http
+
+
+ 头文件\aws\core\http
+
+
+ 头文件\aws\core\http\curl
+
+
+ 头文件\aws\core\http\curl
+
+
+ 头文件\aws\core\http\standard
+
+
+ 头文件\aws\core\http\standard
+
+
+ 头文件\aws\core\http\windows
+
+
+ 头文件\aws\core\http\windows
+
+
+ 头文件\aws\core\http\windows
+
+
+ 头文件\aws\core\http\windows
+
+
+ 头文件\aws\core\http\windows
+
+
+ 头文件\aws\core\http\windows
+
+
+ 头文件\aws\core\http\windows
+
+
+ 头文件\aws\core\internal
+
+
+ 头文件\aws\core\platform
+
+
+ 头文件\aws\core\platform
+
+
+ 头文件\aws\core\platform
+
+
+ 头文件\aws\core\platform
+
+
+ 头文件\aws\core\platform
+
+
+ 头文件\aws\core\platform
+
+
+ 头文件\aws\core\platform
+
+
+ 头文件\aws\core\platform\refs
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils
+
+
+ 头文件\aws\core\utils\base64
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto
+
+
+ 头文件\aws\core\utils\crypto\bcrypt
+
+
+ 头文件\aws\core\utils\crypto\commoncrypto
+
+
+ 头文件\aws\core\utils\crypto\openssl
+
+
+ 头文件\aws\core\utils\json
+
+
+ 头文件\aws\core\utils\logging
+
+
+ 头文件\aws\core\utils\logging
+
+
+ 头文件\aws\core\utils\logging
+
+
+ 头文件\aws\core\utils\logging
+
+
+ 头文件\aws\core\utils\logging
+
+
+ 头文件\aws\core\utils\logging
+
+
+ 头文件\aws\core\utils\logging
+
+
+ 头文件\aws\core\utils\logging
+
+
+ 头文件\aws\core\utils\logging\android
+
+
+ 头文件\aws\core\utils\memory
+
+
+ 头文件\aws\core\utils\memory
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\memory\stl
+
+
+ 头文件\aws\core\utils\ratelimiter
+
+
+ 头文件\aws\core\utils\ratelimiter
+
+
+ 头文件\aws\core\utils\stream
+
+
+ 头文件\aws\core\utils\stream
+
+
+ 头文件\aws\core\utils\stream
+
+
+ 头文件\aws\core\utils\threading
+
+
+ 头文件\aws\core\utils\threading
+
+
+ 头文件\aws\core\utils\threading
+
+
+ 头文件\aws\core\utils\xml
+
+
+ 头文件
+
+
+
+
+ 头文件\aws\core
+
+
+ 头文件\aws\core
+
+
+
+
+ 资源文件
+
\ No newline at end of file
diff --git a/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOSRM.cpp b/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOSRM.cpp
index c42a505..5e03692 100644
--- a/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOSRM.cpp
+++ b/DFL_WL_BOM_TOERP/DFL_WL_BOM_TOSRM.cpp
@@ -1,7 +1,7 @@
#include
#include
#include "dfl_custom.h"
-#include "ocilib.h"
+//#include "ocilib.h"
#include
#include
#include
@@ -32,11 +32,180 @@ using namespace std;
//#include "dfl_custom.h"
//#include "util.h"
//#include
-//#include "ocilib.h"
+#include "ocilib.h"
//using namespace std;
+#include
+#include
+#include
+#include "curlToFtp.h"
+//#include "httplib.h"
+
+//引入minIO需要的库
+#define USE_IMPORT_EXPORT
+#include"iostream"
+
+#include "aws\s3\S3Client.h"
+#include "aws\core\Aws.h"
+#include "aws\core\auth\AWSCredentialsProvider.h"
+#include
+#include
+using namespace Aws::S3;
+using namespace Aws::S3::Model;
+using namespace std;
+
+#include "aws\s3\model\PutObjectRequest.h"
+#include "aws\s3\model\GetObjectRequest.h"
+#include
+#include
+//#include "base64.h"
+
+
extern "C" int POM_AM__set_application_bypass(logical bypass);
+/*
+ 判断对象objtag是否属于type_name类型
+*/
+bool isTypeOf(tag_t objtag, const char* type_name) {
+ tag_t type = NULLTAG;
+ TCTYPE_ask_object_type(objtag, &type);
+ tag_t item_type = NULLTAG;
+ TCTYPE_find_type(type_name, "", &item_type);
+ bool is_type = false;
+ if (item_type != NULLTAG) {
+ logical isok = FALSE;
+ TCTYPE_is_type_of(type, item_type, &isok);
+ if (isok) {
+ is_type = true;
+ }
+ }
+ return is_type;
+}
+
+
+// 声明
+std::string base64_encode(unsigned char const* bytes_to_encode, size_t in_len, bool url = false);
+
+static const char* base64_chars[2] = {
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789"
+ "+/",
+
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789"
+ "-_" };
+
+// 定义
+std::string base64_encode(unsigned char const* bytes_to_encode, size_t in_len, bool url) {
+
+ size_t len_encoded = (in_len + 2) / 3 * 4;
+
+ unsigned char trailing_char = url ? '.' : '=';
+
+ const char* base64_chars_ = base64_chars[url];
+
+ std::string ret;
+ ret.reserve(len_encoded);
+
+ unsigned int pos = 0;
+
+ while (pos < in_len) {
+ ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0xfc) >> 2]);
+
+ if (pos + 1 < in_len) {
+ ret.push_back(base64_chars_[((bytes_to_encode[pos + 0] & 0x03) << 4) + ((bytes_to_encode[pos + 1] & 0xf0) >> 4)]);
+
+ if (pos + 2 < in_len) {
+ ret.push_back(base64_chars_[((bytes_to_encode[pos + 1] & 0x0f) << 2) + ((bytes_to_encode[pos + 2] & 0xc0) >> 6)]);
+ ret.push_back(base64_chars_[bytes_to_encode[pos + 2] & 0x3f]);
+ }
+ else {
+ ret.push_back(base64_chars_[(bytes_to_encode[pos + 1] & 0x0f) << 2]);
+ ret.push_back(trailing_char);
+ }
+ }
+ else {
+
+ ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0x03) << 4]);
+ ret.push_back(trailing_char);
+ ret.push_back(trailing_char);
+ }
+
+ pos += 3;
+ }
+
+ return ret;
+}
+
+
+/*
+* system函数是阻塞调用,如果FTP服务器响应缓慢或网络不稳定,会导致程序长时间等待。
+*/
+bool UploadFileToFtp(const std::string& filePath, const std::string& ftpTargetPath,
+ const std::string& ftpServer, const std::string& ftpUsername, const std::string& ftpPassword) {
+ printf("UploadFileToFtp方法开始执行~\n");
+ printf("=> filePath: %s\n", filePath.c_str());
+ printf("=> ftpTargetPath: %s\n", ftpTargetPath.c_str());
+ printf("=> ftpServer: %s\n", ftpServer.c_str());
+ printf("=> ftpUsername: %s\n", ftpUsername.c_str());
+ printf("=> ftpPassword: %s\n", ftpPassword.c_str());
+ //std::string ftpUrl = "ftp://" + ftpUsername + ":" + ftpPassword + "@" + ftpServer + ftpTargetPath;
+ std::string ftpUrl = "ftp://" + ftpServer + ftpTargetPath;
+
+ if (!ftpTargetPath.empty() && ftpTargetPath.back() != '/') {
+ ftpUrl += "/";
+ }
+
+ size_t lastSlashPos = filePath.find_last_of("\\/");
+ std::string fileName = (lastSlashPos == std::string::npos) ? filePath : filePath.substr(lastSlashPos + 1);
+ //ftpUrl += fileName;
+
+ //std::string command = "curl --max-time 30 -T \"" + filePath + "\" \"" + ftpUrl + "\"";
+
+ // 构建curl命令,包含用户名和密码
+ std::string command = "curl --max-time 60 -u \"" + ftpUsername + ":" + ftpPassword + "\" -T \"" + filePath + "\" \"" + ftpUrl + "\"";
+
+
+ int result = system(command.c_str());
+
+ if (result == 0) {
+ std::cout << "File uploaded successfully." << std::endl;
+ return true;
+ }
+ else {
+ std::cerr << "There was an error uploading the file." << std::endl;
+ return false;
+ }
+}
+
+bool is_utf8(const char* str) {
+ int c;
+ while (*str) {
+ c = (unsigned char)*str;
+ if (c > 0 && c < 128) {
+ str++;
+ }
+ else if ((c & 0xE0) == 0xC0) {
+ if ((*(str + 1) & 0xC0) != 0x80) return false;
+ str += 2;
+ }
+ else if ((c & 0xF0) == 0xE0) {
+ if ((*(str + 1) & 0xC0) != 0x80 || (*(str + 2) & 0xC0) != 0x80) return false;
+ str += 3;
+ }
+ else if ((c & 0xF8) == 0xF0) {
+ if ((*(str + 1) & 0xC0) != 0x80 || (*(str + 2) & 0xC0) != 0x80 || (*(str + 3) & 0xC0) != 0x80) return false;
+ str += 4;
+ }
+ else {
+ return false;
+ }
+ }
+ return true;
+}
+
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;
@@ -62,7 +231,79 @@ string GbkToUtf8(const std::string& strGbk)//传入的strGbk是GBK编码
strUtf8 = NULL;
return strTemp;
}
+string GBKToUTF8_2(const char* data)
+{
+ string GBK = "";
+ //1、GBK转unicode
+ //1.1 统计转换后的字节数
+ int len = MultiByteToWideChar(CP_ACP, //转换的格式
+ 0, //默认的转换方式
+ data, //输入的字节
+ -1, //输入的字符串大小 -1找\0结束 自己去算
+ 0, //输出(不输出,统计转换后的字节数)
+ 0 //输出的空间大小
+ );
+ if (len <= 0)
+ {
+ return GBK;
+ }
+ wstring udata; //用wstring存储的
+ udata.resize(len);//分配大小
+ //开始写进去
+ MultiByteToWideChar(CP_ACP, 0, data, -1, (wchar_t*)udata.data(), len);
+
+
+ //2 unicode 转 utf8
+ len = WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, 0, 0,
+ 0, //失败替代默认字符
+ 0 //是否使用默认替代 0 false
+ );
+ if (len <= 0)
+ {
+ return GBK;
+ }
+ GBK.resize(len);
+ WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, (char*)GBK.data(), len, 0, 0);
+
+ return GBK;
+}
+
+string UTF8ToGBK_2(const char* data)
+{
+ string utf8 = "";
+ //1、UTF8 先要转为unicode windows utf16
+ //1.1 统计转换后的字节数
+ int len = MultiByteToWideChar(CP_UTF8, //转换的格式
+ 0, //默认的转换方式
+ data, //输入的字节
+ -1, //输入的字符串大小 -1找\0结束 自己去算
+ 0, //输出(不输出,统计转换后的字节数)
+ 0 //输出的空间大小
+ );
+ if (len <= 0)
+ {
+ return utf8;
+ }
+ wstring udata; //用wstring存储的
+ udata.resize(len);//分配大小
+ //开始写进去
+ MultiByteToWideChar(CP_UTF8, 0, data, -1, (wchar_t*)udata.data(), len);
+
+
+ //2 unicode 转 GBK
+ len = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, 0, 0,
+ 0, //失败替代默认字符
+ 0 //是否使用默认替代 0 false
+ );
+ if (len <= 0)
+ {
+ return utf8;
+ }
+ utf8.resize(len);
+ WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, (char*)utf8.data(), len, 0, 0);
+ return utf8;
+}
char* U2G(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
@@ -77,10 +318,364 @@ char* U2G(const char* utf8)
return str;
}
-void createDir(string dPath,string mdCommand) {
- if (_access(dPath.c_str(), 0) != 0) {//判断文件夹是否存在
- system(mdCommand.append(dPath).c_str());
+std::wstring s2ws(const std::string& s)
+{
+ int len;
+ int slength = (int)s.length() + 1;
+ len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
+ wchar_t* buf = new wchar_t[len];
+ MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
+ std::wstring r(buf);
+ delete[] buf;
+ return r;
+}
+
+
+// 函数用于转义需要在JSON中使用的字符串,不然在处理JSON数据时遇到了不认识的字符转义错误
+std::string escapeJson(const std::string& input) {
+ std::string output;
+ output.reserve(input.size() * 2); // 预分配足够的空间以提高性能
+
+ for (unsigned char c : input) { // 使用unsigned char来避免符号扩展问题
+ switch (c) {
+ case '"': output += "\\\""; break;
+ case '\\': output += "\\\\"; break;
+ case '\b': output += "\\b"; break;
+ case '\f': output += "\\f"; break;
+ case '\n': output += "\\n"; break;
+ case '\r': output += "\\r"; break;
+ case '\t': output += "\\t"; break;
+ default:
+ // 对于ASCII控制字符(0x00-0x1F),使用Unicode转义序列
+ if (std::iscntrl(c)) {
+ char buffer[7];
+ snprintf(buffer, sizeof(buffer), "\\u%04X", c);
+ output += buffer;
+ }
+ else {
+ // 直接添加非ASCII控制字符(包括中文)
+ output += c;
+ }
+ }
+ }
+
+ return output;
+}
+
+// 回调函数,用于处理服务器返回的数据
+size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
+ ((std::string*)userp)->append((char*)contents, size * nmemb);
+ return size * nmemb;
+}
+
+bool uploadFileToMinIO(const std::string& filePath, const std::string& bucketFileName) {
+ CURL* curl;
+ CURLcode res;
+ std::string readBuffer;
+ curl = curl_easy_init();
+ if (curl) {
+ curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
+ curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/minio/upload");
+ 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: multipart/form-data");
+ //headers = curl_slist_append(headers, "Accept-Charset: GBK");
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+
+ printf("C++上传文件到minIO方法入参:localFilePath=【%s】,bucketPath=【%s】\n", filePath.c_str(), bucketFileName.c_str());
+ curl_mime* mime;
+ curl_mimepart* part;
+ mime = curl_mime_init(curl);
+ //string filePathString = GBKToUTF8_2(filePath.c_str());
+ part = curl_mime_addpart(mime);
+ curl_mime_name(part, "filePath");
+ curl_mime_filedata(part, filePath.c_str());
+
+ //string gbkString = UTF8ToGBK_2(bucketFileName.c_str());
+ string utf8String = GBKToUTF8_2(bucketFileName.c_str());
+
+
+ part = curl_mime_addpart(mime);
+ curl_mime_name(part, "bucketFileName");
+ curl_mime_data(part, utf8String.c_str(), CURL_ZERO_TERMINATED);
+ curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
+
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
+ res = curl_easy_perform(curl);
+ if (res != CURLE_OK) {
+ printf("C++上传文件到minIO方法失败,错误码:%d,错误信息:%s\n", res, curl_easy_strerror(res));
+ }
+ else
+ {
+ printf("C++上传文件到minIO方法成功,成功码:%d,响应信息:%s\n", res, curl_easy_strerror(res));
+ }
+ curl_mime_free(mime);
+ curl_slist_free_all(headers);
+ }
+ curl_easy_cleanup(curl);
+ return true;
+}
+
+ //上传文件到MinIO的方法SS
+//bool uploadFileToMinIO(const std::string& filePath, const std::string& bucketFileName) {
+// CURL* curl;
+// CURLcode res;
+// printf("C++上传文件到minIO方法入参:localFilePath=【%s】,bucketPath=【%s】\n", filePath.c_str(), bucketFileName.c_str());
+// // 初始化curl
+// curl_global_init(CURL_GLOBAL_DEFAULT);
+// curl = curl_easy_init();
+// if (curl) {
+// // 设置URL
+// std::string url = "http://localhost:8080/minio/upload";
+// curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
+// curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
+// struct curl_slist* headers = NULL;
+// headers = curl_slist_append(headers, "Accept-Charset: GBK");
+// headers = curl_slist_append(headers, "Content-Type: application/json;charset=GBK");
+// curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+//
+// // 准备POST数据
+// std::string postFields = "file=" + filePath + "&bucketFileName=" + bucketFileName;
+// const char* data = U2G(postFields.c_str());
+// curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
+// curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
+// curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20);
+// printf("06\n");
+// // 执行请求
+// res = curl_easy_perform(curl);
+// printf("06\n");
+// // 检查错误
+// if (res != CURLE_OK) {
+// std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
+// curl_easy_cleanup(curl);
+// curl_global_cleanup();
+// return false;
+// }
+//
+// // 清理
+// curl_easy_cleanup(curl);
+// }
+// curl_global_cleanup();
+//
+// return true;
+//}
+
+//====================================================================
+
+//std::string escapeJson(const std::string& input) {
+// std::ostringstream ss;
+// for (unsigned char c : input) {
+// switch (c) {
+// case '"': ss << "\\\""; break;
+// case '\\': ss << "\\\\"; break;
+// case '\b': ss << "\\b"; break;
+// case '\f': ss << "\\f"; break;
+// case '\n': ss << "\\n"; break;
+// case '\r': ss << "\\r"; break;
+// case '\t': ss << "\\t"; break;
+// default: ss << c; // 直接添加其他字符
+// }
+// }
+// return ss.str();
+//}
+//
+//void cleanup(CURL* curl, struct curl_slist* headers) {
+// if (curl) curl_easy_cleanup(curl);
+// if (headers) curl_slist_free_all(headers);
+// curl_global_cleanup();
+//}
+//
+//bool uploadFileToMinIO(const std::string& filePath, const std::string& bucketFileName) {
+// CURL* curl;
+// CURLcode res;
+//
+// printf("C++上传文件到minIO方法入参:localFilePath=【%s】,bucketPath=【%s】\n",
+// filePath.c_str(), bucketFileName.c_str());
+// // 将字符串转换为 unsigned char* 类型,因为 base64_encode 需要这种类型的输入
+// const unsigned char* bytes_to_encode_filePath = reinterpret_cast(filePath.c_str());
+// size_t in_len1 = filePath.size();
+// // 调用 base64_encode 函数进行编码,默认不使用 URL 安全字符
+// std::string encoded_str_filePath = base64_encode(bytes_to_encode_filePath, in_len1);
+//
+// const unsigned char* bytes_to_encode_bucketFileName = reinterpret_cast(bucketFileName.c_str());
+// size_t in_len2 = bucketFileName.size();
+// // 调用 base64_encode 函数进行编码,默认不使用 URL 安全字符
+// std::string encoded_str_bucketFileName = base64_encode(bytes_to_encode_bucketFileName, in_len2);
+//
+// curl_global_init(CURL_GLOBAL_DEFAULT);
+// curl = curl_easy_init();
+// if (!curl) {
+// std::cerr << "curl初始化失败!" << std::endl;
+// return false;
+// }
+//
+// printf("curl初始化完成!开始发送请求···\n");
+//
+// std::string url = "http://localhost:8080/minio/upload";
+// curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
+//
+// std::string jsonPayload = "{\"filePath\":\"" + encoded_str_filePath
+// + "\",\"bucketFileName\":\"" + encoded_str_bucketFileName
+// + "\"}";
+//
+// curl_easy_setopt(curl, CURLOPT_POST, 1L);
+// curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonPayload.c_str());
+// curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, jsonPayload.size());
+//
+// struct curl_slist* headers = NULL;
+// headers = curl_slist_append(headers, "Content-Type: application/json; charset=UTF-8");
+// curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+//
+// res = curl_easy_perform(curl);
+//
+// if (res != CURLE_OK) {
+// std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
+// cleanup(curl, headers);
+// return false;
+// }
+//
+// long http_code = 0;
+// curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
+// if (http_code != 200) {
+// std::cerr << "HTTP request failed with code: " << http_code << std::endl;
+// cleanup(curl, headers);
+// return false;
+// }
+//
+// cleanup(curl, headers);
+// return true;
+//}
+
+
+
+
+
+/*
+* 创建FTP层级目录
+*/
+int createFTPDir(HINTERNET session, char* dir) {
+ int ifail = ITK_ok;
+ std::string str(dir); // 将 char* 转换为 std::string
+ std::istringstream iss(str);
+ std::vector parts;
+ std::string part;
+ std::string createPath;
+
+ while (std::getline(iss, part, '/')) {
+ if (!part.empty()) { // 忽略空字符串
+ parts.push_back(part);
+ }
+ }
+
+ for (const auto& p : parts) {
+ std::cout << p << std::endl;
+ createPath += "/" + p;
+ if (FtpCreateDirectoryA(session, createPath.c_str()))
+ {
+ WriteLog("提示:创建FTP文件夹成功== %s\n", createPath.c_str());
+ }
+ else
+ {
+ WriteLog("提示:创建FTP文件夹失败== %s,若已存在此文件夹请忽略!\n", createPath.c_str());
+ }
+ }
+ // 创建成功后尝试切换到新建目录下
+ BOOL dirChangeResult = FtpSetCurrentDirectoryA(session, dir);
+ if (!dirChangeResult)
+ {
+ WriteLog("》》》提示:切换到新建目录 %s 失败!\n", dir);
+ return false;
+ }
+ else {
+ WriteLog("》》》提示:成功切换到新建目录 %s。\n", dir);
+ }
+ return ifail;
+}
+
+
+/*
+* 清空远程目录下所有文件
+*/
+bool DeleteLRDirectory(const char* directory)
+{
+ CURL* curl;
+ CURLcode res;
+ std::string readBuffer;
+ curl = curl_easy_init();
+ if (curl) {
+ curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
+ curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/minio/deleteByDir");
+ 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: multipart/form-data");
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+ printf("C++清空minIO目录方法入参:directory=【%s】\n", directory);
+ curl_mime* mime;
+ curl_mimepart* part;
+ mime = curl_mime_init(curl);
+
+ part = curl_mime_addpart(mime);
+ curl_mime_name(part, "directory");
+ curl_mime_data(part, directory, CURL_ZERO_TERMINATED);
+
+ curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
+ res = curl_easy_perform(curl);
+ if (res != CURLE_OK) {
+ printf("C++清空minIO目录失败,错误码:%d,错误信息:%s\n", res, curl_easy_strerror(res));
+ }
+ else
+ {
+ printf("C++清空minIO目录成功,成功码:%d,响应信息:%s\n", res, curl_easy_strerror(res));
+ }
+ curl_mime_free(mime);
+ curl_slist_free_all(headers);
+ }
+ curl_easy_cleanup(curl);
+ return true;
+}
+
+
+/*o
+* 判断dpath路径是否存在,存在则清空该文件夹下的所有文件和子目录,否则创建该文件夹
+* @param dPath:文件夹路径
+*/
+void clearDir(string dPath) {
+ string command = "";
+ if (_access(dPath.c_str(), 0) == 0) {//文件已存在,则清空该文件夹下的所有文件和子目录
+ command.append("del /q ");
+ command.append(dPath);
+ command.append("*");
+ system(command.c_str());
+ printf("提示:清空文件夹命令:%s!\n",command.c_str());
+ }
+ else
+ {
+ string mdCommand = "md ";
+ mdCommand.append(dPath);
+ system(mdCommand.c_str());
+ printf("提示:新建文件夹成功!");
+ }
+}
+
+
+// 函数定义
+std::string removeLastFileName(const std::string& path) {
+ // 查找最后一个反斜杠的位置
+ size_t lastSlashPos = path.find_last_of('\\');
+
+ // 如果找到了反斜杠,并且它不是最后一个字符,则返回该位置之前的子字符串
+ if (lastSlashPos != std::string::npos && lastSlashPos != path.length() - 1) {
+ return path.substr(0, lastSlashPos);
}
+
+ // 如果最后一个字符是反斜杠,或者没有找到反斜杠,返回原字符串
+ return path;
}
void Split(string strArg, string spliter, vector& ans)
@@ -117,741 +712,1768 @@ void Split(string strArg, string spliter, vector& ans)
}
}
+/*o
+* 异步任务处理完成时,根据流程id变更状态为“已完成”
+* @param flow_uid:流程id
+* @param field_name:要更新的字段名
+* @param new_value:要更新的字段值
+*
+*/
+int setAttrForTask(const char* flow_uid, const char* field_name, const char* new_value) {
+ char sql_changeStatus[1024] = "\0";
+ sprintf(sql_changeStatus, "update WHBH_CAPP_TASK set %s='%s' where FLOWID='%s'", field_name, new_value, flow_uid);
+ printf("提示:sql_changeStatus==%s \n", sql_changeStatus);
+ if (ExecuteSQLNoInputParam(sql_changeStatus) == -1) {
+ printf("》》》异常提示:更新流程状态失败!sql_changeStatus == %s\n", sql_changeStatus);
+ return 1;
+ }else {
+ printf("》》》提示:更新流程状态成功!sql_changeStatus == %s\n", sql_changeStatus);
+ ExecuteSQLNoInputParam("commit");
+ }
+ return 0;
+}
+
+/*o
+* 获取当前yyyy-MM-dd HH-mm-ss格式的日期
+*/
+void get_current_time(char* updatetime) {
+ // 获取当前时间的秒数
+ time_t rawtime;
+ time(&rawtime);
+
+ // 将秒数转换为本地时间结构体
+ struct tm* timeinfo;
+ timeinfo = localtime(&rawtime);
+
+ // 格式化时间为字符串
+ sprintf(updatetime, "%04d-%02d-%02d %02d:%02d:%02d",
+ timeinfo->tm_year + 1900, // 年份从1900年开始计算
+ timeinfo->tm_mon + 1, // 月份从0开始计算
+ timeinfo->tm_mday, // 日
+ timeinfo->tm_hour, // 小时
+ timeinfo->tm_min, // 分钟
+ timeinfo->tm_sec); // 秒
+}
-//物料传递erp
-int DFL_WL_TO_SRM(char** c_sql_values, const char* flow_uid) {
- WriteLog("===================================\n");
- WriteLog("WL to SRM begin\n");
- WriteLog("===================================\n");
-
+/*o
+* 保存物料相关信息到数据库表-WHBH_CAPP_PART
+*/
+int savePart(tag_t revisionTag, char* username) {
+ printf("提示:开始执行savePart方法,得到username==%s \n", username);
+ tag_t itemTag = NULLTAG;
+ printf("提示:开始保存物料信息到数据库表 \n");
+ //TODO 根据版本获取对象
+ ITKCALL(ITEM_ask_item_of_rev(revisionTag, &itemTag));
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"
+ int return_tag = 0;
+ char* materialno = NULL,//物料编码
+ * name = NULL,//物料名称
+ * version = NULL,//物料版本
+ * unit = NULL,//单位
+ * specification = NULL,//物料规格
+ * designno = (char*)MEM_alloc(1028 * sizeof(char)),//图号
+ * dversion = (char*)MEM_alloc(1028 * sizeof(char)),//图纸版本
+ * orderno = NULL,//令号
+ * source = NULL,//物料来源
+ * purchase = NULL,//品牌说明
+ * issuedtime = (char*)MEM_alloc(1028 * sizeof(char)),//下发时间
+ * updatetime = (char*)MEM_alloc(1028 * sizeof(char));//更新时间
+ char* userid;
+ tag_t* revMasterTags = NULL;//表单对象
+ tag_t tuzTag = NULLTAG;//图纸对象
+ tag_t* tuzTags = NULL;
+ char*** flowUID_values = NULL;
+ int outputValueCount;
+ char* type = NULL;
+ printf("提示:开始组织物料表信息 \n");
+ ITKCALL(ifail = AOM_ask_value_string(itemTag, "item_id", &materialno));
+ ITKCALL(ifail = AOM_ask_value_string(itemTag, "object_name", &name));
+ ITKCALL(ifail = AOM_ask_value_string(itemTag, "object_type", &type));
+ ITKCALL(ifail = AOM_UIF_ask_value(itemTag, "uom_tag", &unit));
+
+ printf("===>提示:物料【%s】类型【%s】的单位==%s \n",name,type, unit);
+ ITKCALL(ifail = AOM_ask_value_string(revisionTag, "item_revision_id", &version));
+ //组织版本表单属性:根据版本对象获取表单对象
+ int revMasterNum = 0;
+ ITKCALL(ifail = AOM_ask_value_tags(revisionTag, "IMAN_master_form_rev", &revMasterNum, &revMasterTags));
+ if (revMasterNum > 0)
+ {
+ printf("=============================>>>提示:获取表单对象成功,共有%d个表单对象 \n", revMasterNum);
+ for (int i = 0; i < revMasterNum; i++)
{
- WriteLog("提示:中间数据表访问失败\n");
- return ifail;
+ ITKCALL(ifail = AOM_ask_value_string(revMasterTags[i], "h8_specification", &specification));
+ ITKCALL(ifail = AOM_ask_value_string(revMasterTags[i], "h8_linghao", &orderno));
+ ITKCALL(ifail = AOM_ask_value_string(revMasterTags[i], "h8_material_source", &source));
+ ITKCALL(ifail = AOM_ask_value_string(revMasterTags[i], "h8_ppsm", &purchase));
+
}
- 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)
+
+ }
+ else
+ {
+ printf("提示:表单对象为空,无法获取物料表单信息 \n");
+ }
+ int tuz_count = 0;
+
+ //组织物料下的图纸属性:根据版本对象获取"提供者"关系文件夹下的图纸版本对象
+ char* wlbb = NULL;
+ ITKCALL(ifail = AOM_ask_value_tags(revisionTag, "TC_Is_Represented_By", &tuz_count, &tuzTags));
+ ITKCALL(ifail = AOM_ask_value_string(revisionTag, "item_id", &wlbb));
+
+ printf("=============>>>提示:物料::%s提供者关系文件夹下的图纸版本对象数量为::%d \n", wlbb, tuz_count);
+ if (tuz_count > 0)
+ {
+ printf("提示:获取‘提供者’关系下的图纸对象成功,个数为%d \n", tuz_count);
+ char* classification = NULL;
+ //对加密图纸的令号designno和版本dversion隐藏:空字符串
+ AOM_ask_value_string(tuzTags[0], "ip_classification", &classification);
+ if (stricmp(classification, "内部") == 0)
+ {
+ printf("提示:图纸对象为非密图纸,令号and版本号正常写入 \n");
+ tag_t* revisionTags = NULLTAG;
+ int revisionNums = 0;
+ ITKCALL(ITEM_ask_item_of_rev(tuzTags[0], &itemTag));//根据图纸版本获取图纸对象
+ ITKCALL(ifail = AOM_ask_value_tags(itemTag, "revision_list", &revisionNums, &revisionTags));
+ //TODO 图纸对象为空时插入异常
+ ITKCALL(ifail = AOM_ask_value_string(itemTag, "item_id", &designno));
+ ITKCALL(ifail = AOM_ask_value_string(revisionTags[revisionNums - 1], "item_revision_id", &dversion));
+ printf("提示:图纸对象:%s 的最新版本对象为:%s \n", designno, dversion);
+
+ MEM_free(revisionTags);
+ }
+ else
+ {
+ printf("提示:图纸对象为加密图纸,令号和版本号置空 \n");
+ strcpy(designno, " ");
+ strcpy(dversion, " ");
+ }
+
+
+ }
+ else
+ {
+ printf("》》》异常提示:图纸对象为空,无法获取关系文件夹下的图纸信息,令号和版本号置空 \n");
+
+ strcpy(designno, " ");
+ printf("111");
+ strcpy(dversion, " ");
+ }
+
+
+ printf("物料表表信息组织完成,开始插入or更新数据到数据库");
+ int outputColumn = 0;
+
+ char sql1[1024] = "\0";
+ sprintf(sql1, "select * from WHBH_CAPP_PART where materialno = '%s' and version = '%s'", materialno, version);
+ printf("提示:sql1==%s\n", sql1);
+ printf("Tt:查询结果判断是否·已存在数据==%d\n", QuerySQLNoInputParam(sql1, &outputColumn, &outputValueCount, &flowUID_values));
+ if (QuerySQLNoInputParam(sql1, &outputColumn, &outputValueCount, &flowUID_values) == -1)
+ {
+ printf("提示:查询数据 失败, %s \n", sql1);
+ //return 1;
+ }
+ else {
+ if (outputValueCount == 0)
+ {
+ printf("提示:未查询到数据, %s \n", sql1);
+ printf("》》》开始插入数据 \n");//插入更新时间和下发时间
+ get_current_time(issuedtime);
+ get_current_time(updatetime);
+ char sql2[1024] = "\0";
+ sprintf(sql2, "insert into WHBH_CAPP_PART(materialno,name,version,unit,specification,designno,dversion,orderno,source,purchase,username,issuedtime,updatetime) values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", materialno, name, version, unit, specification, designno, dversion, orderno, source, purchase, username, issuedtime, updatetime);
+ printf("提示:sql2==%s\n", sql2);
+ if (ExecuteSQLNoInputParam(sql2) == -1)
{
- WriteLog("提示:数据插入 失败, %s \n", sql8);
- return 1;
+ printf("提示:sql2数据插入 失败, %s \n", sql2);
+ //return 1;
+ }
+ else {
+ ExecuteSQLNoInputParam("commit");
+ }
+ }
+ else
+ {
+ printf("提示:查询到已存在数据, %s \n", sql1);
+ printf("==========:outputColumn == %d \n", outputColumn);
+ printf("==========:outputValueCount == %d \n", outputValueCount);
+ printf("》》》开始更新数据 \n");//只更新更新时间
+ get_current_time(updatetime);
+ char sql3[1024] = "\0";
+ sprintf(sql3, "update WHBH_CAPP_PART set name = '%s',unit = '%s',specification = '%s',designno = '%s',dversion = '%s',orderno = '%s',source = '%s',purchase = '%s',username = '%s',updatetime = '%s' where materialno = '%s' and version = '%s'", name, unit, specification, designno, dversion, orderno, source, purchase, username, updatetime, materialno, version);
+ printf("提示:sql3==%s\n", sql3);
+ if (ExecuteSQLNoInputParam(sql3) == -1)
+ {
+ printf("提示:数据更新 失败, %s \n", sql3);
+ //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());
- }
+ /*MEM_free(userid);
+ MEM_free(username);*/
+ MEM_free(dversion);
+ MEM_free(designno);
+ MEM_free(tuzTags);
+ MEM_free(purchase);
+ MEM_free(source);
+ MEM_free(orderno);
+ MEM_free(specification);
+ MEM_free(revMasterTags);
+ MEM_free(version);
+ MEM_free(unit);
+ MEM_free(type);
+ MEM_free(name);
+ MEM_free(materialno);
+ return ifail;
+}
- 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());
- }
+/*o
+* 提取时间字符串中的年月日
+*/
+int extract_date_components(const char* issuedtime, char* year, char* month, char* day) {
+ int ifail = ITK_ok;
+
+ // 提取年
+ strncpy(year, issuedtime, 4);
+ year[4] = '\0'; // 确保字符串正确终止
+
+ // 提取月
+ strncpy(month, issuedtime + 5, 2);
+ month[2] = '\0'; // 确保字符串正确终止
+
+ // 提取日
+ strncpy(day, issuedtime + 8, 2);
+ day[2] = '\0'; // 确保字符串正确终止
- 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");
+ return ifail;
+}
- }
- 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");
+/*o
+* 保存图纸相关信息到数据库表中-WHBH_CAPP_DESIGN
+* 保存版本下关联的数据集存到服务器目录下
+* revisionTag:版本对象
+*/
+int saveDrawing(tag_t revisionTag, char* username) {
+ printf("方法-saveDrawing开始执行,接受到参数username==%s \n", username);
+ int ifail = ITK_ok;
+ char* designno,
+ * version,
+ * weight,
+ * materials,
+ * specification,
+ * name,
+ * address = (char*)malloc(128),
+ * userid,
+ * issuedtime = (char*)MEM_alloc(1028 * sizeof(char)),
+ * updatetime = (char*)MEM_alloc(1028 * sizeof(char)),
+ * nowTime = (char*)MEM_alloc(1028 * sizeof(char));
+
+ tag_t itemTag = NULLTAG;//图纸对象
+ tag_t* revMasterTags = NULL;//版本表单
+ tag_t revMasterTag = NULLTAG;
+ int dataset_num = 0;
+ tag_t* dataset_tags = NULL;
+ char* file_type = NULL;
+ char* origin_file_name = NULL,
+ * ref_file_name = NULL,
+ * ref_type = NULL,
+ * dataset_name = NULL;
+ // 为年、月、日分配存储空间
+ char year[5]; // "yyyy" + null 终止符
+ char month[3]; // "MM" + null 终止符
+ char day[3]; // "dd" + null 终止符
+ tag_t* ref_object = NULL;
+ int n_found = 0;
+ //get_current_time(nowTime);
+ string addressv;
+
+
+
+ ITKCALL(ITEM_ask_item_of_rev(revisionTag, &itemTag));
+
+ int revMasterNum = 0;
+ ITKCALL(ifail = AOM_ask_value_tags(revisionTag, "IMAN_master_form_rev", &revMasterNum, &revMasterTags));//获取图纸版本对象下的版本表单
+ if (revMasterNum > 0)
+ {
+ printf(">>>>>提示:图纸版本对象下有版本表单,开始获取版本表单信息 \n");
+ for (int i = 0; i < revMasterNum; i++)
+ {
+ char* typevalue;
+ AOM_ask_value_string(revMasterTags[i], "object_type", &typevalue);
+ printf("》》》版本表单类型:%s\n", typevalue);
+ //1.组织图纸对象属性
+ ITKCALL(ifail = AOM_ask_value_string(itemTag, "item_id", &designno));
+ ITKCALL(ifail = AOM_ask_value_string(revisionTag, "item_revision_id", &version));
+ ITKCALL(ifail = AOM_ask_value_string(revMasterTags[i], "h8_weight", &weight));
+ ITKCALL(ifail = AOM_ask_value_string(revMasterTags[i], "h8_materials", &materials));
+ ITKCALL(ifail = AOM_ask_value_string(revMasterTags[i], "h8_material_specification", &specification));
+ printf("获取到的weight==%s继续后续流程\n", weight);
+ if (weight == NULL || weight[0] == '\0')
+ {
+ strcpy(weight, "");
+ printf("提示:获取weight失败,请检查属性值是否存在!\n");
+ }
+ if (materials == NULL || materials[0] == '\0')
+ {
+ strcpy(materials, "");
+ printf("提示:获取materials失败,请检查属性值是否存在!\n");
+ }
+ if (specification == NULL || specification[0] == '\0') {
+ strcpy(specification, "");
+ printf("提示:获取specification失败,请检查属性值是否存在!\n");
+ }
+ ITKCALL(ifail = AOM_ask_value_string(itemTag, "object_name", &name));
+ printf("》》》当前正在保存的图纸信息为:图号==%s,图纸名称==%s,版本==%s\n", designno, name, version);
+
+ /*tag_t user;
+ POM_get_user(&username, &user);
+ POM_get_user_id(&userid);*/
+
+ //------------开始判断存入图纸信息到数据库-----------------------------------------------------------------------------
+ int outputValueCount,
+ outputColumn;
+ char*** result_values;
+ char sql_cx[1024] = "\0";
+ sprintf(sql_cx, "select ADDRESS from WHBH_CAPP_DESIGN where designno='%s' and version='%s' ", designno, version);
+ printf("提示:cxsql==%s\n", sql_cx);
+ if (QuerySQLNoInputParam(sql_cx, &outputColumn, &outputValueCount, &result_values) == -1) {
+ printf("提示:cxsql查询失败\n");
+ return 1;
+ }
+ get_current_time(issuedtime);
+ get_current_time(updatetime);
+ printf(">>>>>查询结构:outputColumn==%d ,outputValueCount==%d \n", outputColumn, outputValueCount);
+ //--------------获取首选项中的FTP信息并与FTP建立连接----------------------------------------------------------------------------------------------------
+ //获取首选项中配置的连接FTP的IP地址、用户名、密码
+ int ftp_value_count = 0;
+ char** ftp_option_values;
+ char* ftp_ip = (char*)MEM_alloc(64*sizeof(char)),
+ * ftp_user = (char*)MEM_alloc(64 * sizeof(char)),
+ * ftp_password = (char*)MEM_alloc(64 * sizeof(char));
+ //struct tm* lt2;
+ ITKCALL(PREF_ask_char_values("BH_CAPP_FTP", &ftp_value_count, &ftp_option_values));
+ if (ftp_value_count != 3)
+ {
+ printf("首选项配置项错误:配置数量==%d,请核查!\n", ftp_value_count);
+ return ifail;
+ }
+ //printf("===>开始连接FTP服务器···");
+ ////连接FTP服务器
+ //HINTERNET hInternet = NULL, hFtpSession = NULL;
+ //hInternet = InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
+ //hFtpSession = InternetConnectA(
+ // hInternet,
+ // ftp_option_values[0],
+ // INTERNET_DEFAULT_FTP_PORT,
+ // ftp_option_values[1],
+ // ftp_option_values[2],
+ // INTERNET_SERVICE_FTP,
+ // INTERNET_FLAG_PASSIVE,
+ // 0
+ //);
+ //if (hFtpSession == NULL) {
+ // printf("连接FTP服务器失败\n");
+ //}
+ //else
+ //{
+ // strcpy(ftp_ip, ftp_option_values[0]);
+ // strcpy(ftp_user, ftp_option_values[1]);
+ // strcpy(ftp_password, ftp_option_values[2]);
+ // printf("连接FTP服务器成功\n");
+ //}
+
+
+ printf("===>>>开始判断是否存在原始数据\n");
+ if (outputValueCount == 0)
+ {//不存在图纸原始数据,开始插入图纸数据
+ WriteLog("===>不存在图纸原始数据,开始插入图纸数据\n");
+ //提取年月日组件
+ extract_date_components(issuedtime, year, month, day);
+ string exportName = "C:\\Design_temp\\";
+ string ftpFilePath = "/Design/";
+ exportName.append(year).append("\\").append(month).append("\\").append(day).append("\\").append(designno).append("-").append(version);
+ ftpFilePath.append(year).append("/").append(month).append("/").append(day).append("/").append(designno).append("-").append(version);
+ strcpy(address, ftpFilePath.c_str());//存储地址
+ exportName.append("\\");
+ //准备数据集存放目录
+ clearDir(exportName);
+ //获取图纸版本下关联的数据集,并存储到服务器目录下
+ ITKCALL(AOM_ask_value_tags(revisionTag, "IMAN_specification", &dataset_num, &dataset_tags));
+
+ if (dataset_num > 0)
+ {
+ DeleteLRDirectory(ftpFilePath.c_str());
- }
- 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");
- }
+ //在FTP上提前创建存放数据集文件的文件夹,ftpFilePath路径形如:/Design/2022/01/25/000022-A
+ //ITKCALL(ifail = createFTPDir(hFtpSession, &ftpFilePath[0]));
+
+ printf("提示:图纸版本下有数据集:%d个,开始保存数据集下的引用文件 \n", dataset_num);
+ for (int i = 0; i < dataset_num; i++)
+ {
+ printf("reforbegin\n");
+ WriteLog("提示:开始循环遍历处理数据集[%d]\n", i);
+ //获取数据集文件名称
+ ITKCALL(AOM_ask_value_string(dataset_tags[i], "current_name", &dataset_name));
+ //数据集对象dataset_tags[i],数据集下的引用文件数量n_found,数据集下的引用文件ref_object
+ ITKCALL(AE_ask_dataset_named_refs(dataset_tags[i],&n_found, &ref_object));
+ printf("提示:数据集名称==%s,引用文件数量==%d\n", dataset_name, n_found);
- //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;
+ if (n_found > 0)
+ {
+ for (int j = 0; j < n_found;j++) {
+
+ //获取数据集下引用文件的类型
+ ITKCALL(AOM_ask_value_string(ref_object[j], "object_type", &ref_type));
+ printf("提示:当前引用文件类型==%s\n", ref_type);
+ if (strcmp(ref_type, "ImanFile") == 0) {
+ ITKCALL(AOM_ask_value_string(ref_object[j], "original_file_name", &ref_file_name));
+ if (ref_file_name != NULL && ref_file_name[0] != '\0') {
+ string ftpFilePathTrue = ftpFilePath;
+ //每次拼接文件路径时,去掉最后一个\\符号后的内容(保留\\)
+ string final_exportName = removeLastFileName(exportName);
+
+ final_exportName.append(ref_file_name);//C:\Design\2022\01\25\000022-A\111.dwg
+ printf("》》》提示:数据集下引用文件导出路径==%s \n 开始导出文件:%s》》》 \n", exportName.c_str(), ref_file_name);
+
+ ITKCALL(ifail = IMF_export_file(ref_object[j], final_exportName.c_str()));
+ printf("=======OVER成功导出文件到本地缓存目录:%s======================== \n", final_exportName.c_str());
+ printf("\n");
+ printf("\n");
+ printf("\n");
+
+ ftpFilePathTrue.append("/");
+ std::cout << "==== upload test ====" << std::endl;
+
+ string ip = ftp_ip;
+ string user = ftp_user;
+ string password = ftp_password;
+ /*bool success = UploadFileToFtp(final_exportName,
+ ftpFilePathTrue,
+ ip,
+ user,
+ password);*/
+ ftpFilePathTrue.append(ref_file_name);
+ bool success = uploadFileToMinIO(final_exportName, ftpFilePathTrue);
+ if (success) {
+ printf("提示:FTP上传成功==%s\n", ftpFilePath.c_str());
}
else {
- ExecuteSQLNoInputParam("commit");
+ printf("提示:FTP上传失败==%s\n", ftpFilePath.c_str());
}
+
}
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");
- }
+ printf("提示:数据集[%s]下ImanFile类型的引用文件中不存在origin_file_name属性,获取引用文件名失败!不导出文件\n", dataset_name);
}
+ printf("3\n");
+
}
- curl_easy_cleanup(curl);
-
-
+ printf("4\n");
+
}
+ printf("5\n");
}
+ else
+ {
+ printf("提示:数据集下不存在引用文件,不导出文件\n");
+ }
+ printf("6\n");
+
}
+ printf("7\n");
+ MEM_free(ref_object);
+ MEM_free(ftp_password);
+ MEM_free(ftp_user);
+ MEM_free(ftp_ip);
+ MEM_free(ref_type);
+ MEM_free(dataset_name);
}
- else if(count > 1){
- for (int k = 0; k < dataset_num; k++)
+ else
{
- string exportName = "";
- ITKCALL(AOM_ask_value_string(dataset_tags[k], "object_name", &file_name));
+ printf("提示:数据集不存在,不导出文件\n");
+ }
+ //删除本地临时文件夹上的所有内容
+ WriteLog("》》》FTP上传数据集完成,开始清空本地临时文件夹\n");
+ //clearDir(exportName);
+
- if (strstr(file_name, dwg) || strstr(file_name, DWG)) {
+ printf("提示:不存在原始数据,开始插入数据》》》\n");
+ char sql_ins[1024] = "\0";
+ sprintf(sql_ins, "insert into WHBH_CAPP_DESIGN(designno,version,weight,name,address,username,issuedtime,updatetime,materials,specification) values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", designno, version, weight, name, address, username, issuedtime, updatetime,materials,specification);
+ printf("提示:sqlins==%s\n", sql_ins);
+ if (ExecuteSQLNoInputParam(sql_ins) == -1)
+ {
+ printf("提示:数据插入 失败, %s \n", sql_ins);
+ return 1;
+ }
+ else {
+ ExecuteSQLNoInputParam("commit");
+ }
+ }
+ else if (outputValueCount > 0)
+ {
+ // 存在,更新数据
+ printf("提示:数据已存在,开始更新数据》》》\n");
+ //获取原始数据的数据集物理文件保存地址
+ string ftpExportName = result_values[0][0];// "/Design/2022/01/25/000022-C"
+ string zscfPath = "C:\\Design_temp\\";//暂时存放位置
+ clearDir(zscfPath);
+
+ ITKCALL(AOM_ask_value_tags(revisionTag, "IMAN_specification", &dataset_num, &dataset_tags));
+ if (dataset_num > 0)
+ {
+ //更新
+ WriteLog("已存在原始图纸记录,且更新后的图纸下存在数据集,开始更新FTP文件");
+ // 清空ftp上的ftpExportName目录下的所有文件,为下面循环遍历取得数据集存放做准备
+ DeleteLRDirectory(ftpExportName.c_str());
+ //在FTP上提前创建存放数据集文件的文件夹,ftpFilePath路径形如:/Design/2022/01/25/000022-A/
+ ftpExportName.append("/");
+ //ITKCALL(ifail = createFTPDir(hFtpSession, &ftpExportName[0]));
+
+
+ printf("提示:图纸版本下有数据集:%d个,开始保存数据集下的引用文件 \n", dataset_num);
+ for (int i = 0; i < dataset_num; i++)
+ {
//获取数据集文件名称
- 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;
+ ITKCALL(AOM_ask_value_string(dataset_tags[i], "current_name", &origin_file_name));
+ //数据集对象dataset_tags[i],数据集下的引用文件数量n_found,数据集下的引用文件ref_object
+ ITKCALL(AE_ask_dataset_named_refs(dataset_tags[i], &n_found, &ref_object));
+
+ printf("提示:数据集名称==%s,引用文件数量==%d\n", origin_file_name, n_found);
+
+ if (n_found > 0)
+ {
+ for (int t = 0; t < n_found;t++) {
+ ITKCALL(AOM_ask_value_string(ref_object[t], "object_type", &ref_type));
+ printf("提示:当前引用文件类型==%s\n", ref_type);
+ if (strcmp(ref_type, "ImanFile") == 0) {
+ //获取数据集下引用文件的名称
+ ITKCALL(AOM_ask_value_string(ref_object[t], "original_file_name", &ref_file_name));
+ if (ref_file_name != NULL && ref_file_name[0] != '\0') {
+ printf("提示:数据集下存在引用文件,开始导出文件》》》\n");
+ string final_exportName = zscfPath;// C:\Design_temp\111.dwg
+ final_exportName.append(ref_file_name);
+ //导出当前数据集下存在的引用文件到服务器目录下
+ ITKCALL(ifail = IMF_export_file(ref_object[t], final_exportName.c_str()));
+ printf("=======OVER成功导出文件到本地缓存目录:%s,导出文件:%s======================== \n", final_exportName.c_str(), ref_file_name);
+ printf("\n");
+ printf("\n");
+ printf("\n");
+ string ftpFilePath = ftpExportName;
+ ftpFilePath.append(ref_file_name);
+
+ printf("mao2 \n");
+ string ip = ftp_ip;
+ string user = ftp_user;
+ string password = ftp_password;
+ /*bool success = UploadFileToFtp(final_exportName,
+ ftpExportName,
+ ip,
+ user,
+ password);*/
+
+ bool success = uploadFileToMinIO(final_exportName, ftpFilePath);
+ if (success) {
+ printf("提示:FTP上传成功==%s\n", ftpFilePath.c_str());
+ }
+ else {
+ printf("提示:FTP上传失败==%s\n", ftpFilePath.c_str());
+ }
+ }
}
else {
- ExecuteSQLNoInputParam("commit");
+ printf("提示:数据集[%s]下ImanFile类型的引用文件中不存在origin_file_name属性,获取引用文件名失败!不导出文件\n", origin_file_name);
}
+
}
- //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());
- }
+ }
+ else
+ {
+ printf("提示:数据集下不存在引用文件,不导出文件\n");
+ }
- 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
+ MEM_free(ftp_password);
+ MEM_free(ftp_user);
+ MEM_free(ftp_ip);
+ MEM_free(ref_file_name);
+ MEM_free(ref_type);
+ MEM_free(ref_object);
+ MEM_free(origin_file_name);
+ //clearDir(zscfPath);
+ }
+ else
+ {
+ printf("提示:数据集不存在,不导出文件\n");
+ }
+
+ char sql_upd[1024] = "\0";
+ sprintf(sql_upd, "update WHBH_CAPP_DESIGN set weight = '%s',name = '%s',username = '%s',updatetime = '%s' where designno='%s' and version='%s' and materials='%s' and specification='%s' ", weight,name, username, updatetime, designno, version, materials, specification);
+ printf("提示:sqlupd==%s\n", sql_upd);
+ if (ExecuteSQLNoInputParam(sql_upd) == -1)
+ {
+ printf("提示:数据插入 失败, %s \n", sql_upd);
+ return 1;
+ }
+ else {
+ ExecuteSQLNoInputParam("commit");
+ }
+ }
- 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));
+ MEM_free(dataset_tags);
+ MEM_free(ftp_option_values);
+ MEM_free(name);
+ MEM_free(specification);
+ MEM_free(materials);
+ MEM_free(weight);
+ MEM_free(version);
+ MEM_free(designno);
+ MEM_free(typevalue);
+ }
- 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
-
-
+ }
+ MEM_free(revMasterTags);
+ return ifail;
+}
+/*o
+* 递归BOMLine取得相应的数据存到数据库表中
+* @param topLineTag:当前BOMLine,即为父项
+*/
+int throughAllBom(tag_t topLineTag,char* username) {
+ printf("开始执行方法=>throughAllBom,获取的参数username==%s\n",username);
+ int ifail = ITK_ok;
+ //BOM表中的数据条目
+ char* parent,
+ * parentversion,
+ * parentname,
+ * sub,
+ * subversion = NULL,
+ * subname,
+ * lineno,
+ * quantity,
+ * issuedtime = (char*)MEM_alloc(1028 * sizeof(char)),
+ * updatetime = (char*)MEM_alloc(1028 * sizeof(char));
+ tag_t itemTag = NULLTAG,
+ itemRevisionTag = NULLTAG,
+ partItemRevisionTag = NULLTAG,//物料版本对象
+ partItemTag = NULLTAG,
+ drawingItemRevisionTag = NULLTAG,//物料版本对象
+ drawingItemTag = NULLTAG;//物料对象
+ tag_t childItemRevisionTag,
+ childItemTag;
+ char* userid = NULL;
+ tag_t user;
+ int outputColumnQ = 0;
+ int outputCountQ;
+ char*** outputValuesQ;
+ ITKCALL(ifail = AOM_ask_value_tag(topLineTag, bomAttr_lineItemRevTag, &itemRevisionTag));
+ ITKCALL(ifail = AOM_ask_value_tag(topLineTag, bomAttr_lineItemTag, &itemTag));
+
+ //获取BOM信息
+ ITKCALL(ifail = AOM_ask_value_string(itemTag, "item_id", &parent));
+ ITKCALL(ifail = AOM_ask_value_string(itemRevisionTag, "item_revision_id", &parentversion));
+ ITKCALL(ifail = AOM_ask_value_string(itemTag, "object_name", &parentname));
+ printf("获取到当前物料版本对象的BOM信息:父项版本及名称==%s,%s,%s\n", parent, parentversion, parentname);
+
+ //获取用户名称、id
+ /*POM_get_user(&username, &user);
+ POM_get_user_id(&userid);*/
+
+ tag_t* childLines = NULL;
+ int lineCount = 0;
+ //获取当前bom行-bomline的所有子行
+ BOM_line_ask_child_lines(topLineTag, &lineCount, &childLines);
+ if (lineCount > 0)
+ {
+ for (int i = 0; i < lineCount; i++)
+ {
+ printf("提示:存在子项,开始处理子项信息》》》\n");
+
+ //在进入下一次递归前保存当前子项的物料相关信息
+ ITKCALL(ifail = AOM_ask_value_tag(childLines[i], bomAttr_lineItemRevTag, &childItemRevisionTag));
+ ITKCALL(ifail = AOM_ask_value_tag(childLines[i], bomAttr_lineItemTag, &childItemTag));
+ char* objType;
+ AOM_ask_value_string(childItemRevisionTag, "object_type", &objType); //getStringProperty
+ printf("SB提示:当前版本对象类型==%s\n", objType);
+ if (stricmp(objType, "H8_wuliaoRevision") == 0)//物料BOM
+ {
+ printf("提示:当前子项为物料,开始获取物料信息》》》\n");
+ //保存当前子项的物料信息
+ ITKCALL(ifail = savePart(childItemRevisionTag,username));
+ }
+ else if (stricmp(objType, "H8_frockItemRevision") == 0 || stricmp(objType, "H8_drawingRevision") == 0 || stricmp(objType, "H8_frockItemRevision") == 0 || stricmp(objType, "H8_standardPartsRevision") == 0 || stricmp(objType, "H8_ComponentRevision") == 0) {//图纸BOM
+ char* classification;
+ printf("提示:当前子项为图纸,开始获取图纸信息》》》\n");
- }
- }
+ //判断 密级程度
+ AOM_ask_value_string(childItemRevisionTag, "ip_classification", &classification);
+ if (stricmp(classification, "内部") == 0)
+ {
+ printf(">>>当前图纸为非密图纸,允许下发:%s \n", classification);
+ ITKCALL(ifail = saveDrawing(childItemRevisionTag,username));
}
- //调用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");
- }
+ MEM_free(classification);
+ }
+ //在每个子行中执行save操作,然后将当前子行作为topLineTag递归
+ //从bom子行中获取物料信息
+ //对子项版本特殊处理:物料和图纸的“子项版本”内容不是同一个数据来源
+ ITKCALL(ifail = AOM_ask_value_string(childItemRevisionTag, "item_revision_id", &subversion));
+ ITKCALL(ifail = AOM_ask_value_string(childItemTag, "item_id", &sub));
+ ITKCALL(ifail = AOM_ask_value_string(childItemTag, "object_name", &subname));
+ ITKCALL(ifail = AOM_ask_value_string(childLines[i], "bl_sequence_no", &lineno));
+ ITKCALL(ifail = AOM_ask_value_string(childLines[i], "bl_quantity", &quantity));
+
+ //插入BOM数据到数据库表中
+ char sql_query[1024] = "\0";
+ sprintf(sql_query, "select * from WHBH_CAPP_BOM where parent = '%s' and parentversion = '%s' and sub = '%s' and subversion = '%s'",parent,parentversion,sub,subversion);
+ printf("Info:sql_query==%s\n", sql_query);
+ if (QuerySQLNoInputParam(sql_query,&outputColumnQ,&outputCountQ,&outputValuesQ) == -1){
+ printf("提示:sql_query==%s查询失败\n", sql_query);
+ return NULL;
+ }
+ if (outputCountQ <= 0) {
+ //如果当前BOM不存在原始数据,则插入
+ printf("提示:sql_query==%s无记录\n", sql_query);
+ get_current_time(issuedtime);
+ get_current_time(updatetime);
+ char sql1[1024] = "\0";
+ sprintf(sql1, "insert into WHBH_CAPP_BOM(parent,parentversion,parentname,sub,subversion,subname,lineno,quantity,username,issuedtime,updatetime) values('%s','%s','%s','%s','%s','%s',%s,'%s','%s','%s','%s')", parent, parentversion, parentname, sub, subversion, subname, lineno, quantity, username, issuedtime, updatetime);
+ printf("提示:sql1==%s\n", sql1);
+ if (ExecuteSQLNoInputParam(sql1) == -1)
+ {
+ printf("提示:数据插入 失败, %s \n", sql1);
+ return 1;
}
- //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 {
+ else {
+ ExecuteSQLNoInputParam("commit");
+ }
+ }else{
+ //如果当前BOM数据已存在,则更新
+ get_current_time(updatetime);
+ char sql5[1024] = "\0";
+ sprintf(sql5, "update WHBH_CAPP_BOM set parentname='%s',subname='%s',lineno='%s',quantity='%s',username='%s',updatetime='%s' where parent = '%s' and parentversion = '%s' and sub = '%s' and subversion = '%s'", parentname, subname, lineno, quantity, username,updatetime, parent, parentversion, sub,subversion);
+ printf("提示:sql5==%s\n", sql5);
+ if (ExecuteSQLNoInputParam(sql5) == -1)
+ {
+ printf("提示:数据插入 失败, %s \n", sql5);
+ return 1;
+ }
+ else {
+ ExecuteSQLNoInputParam("commit");
+ }
+ }
+ // 递归
+ throughAllBom(childLines[i],username);
+
+ MEM_free(quantity);
+ MEM_free(lineno);
+ MEM_free(subname);
+ MEM_free(sub);
+ MEM_free(subversion);
+ MEM_free(objType);
+ }
+ }
+ else
+ {
+ printf("》》》异常提示:当前BOM不存在子项,即不存在BOM结构,不处理\n");
+ }
+ MEM_free(childLines);
+ /*MEM_free(userid);
+ MEM_free(username);*/
+ MEM_free(parentname);
+ MEM_free(parentversion);
+ MEM_free(parent);
+ return ifail;
+}
- WriteLog("====>>>>OK\n");
+/*o
+* (exe)服务:获取流程下的对象,判断对象类型:物料or图纸,分别处理
+* @param c_sql_values: 数据库连接信息
+* @param flow_uid: 从“异步任务表”WHBH_CAPP_TASK 中查询出的待处理的流程ID
+*/
+int DFL_WL_TO_CAPP(char** c_sql_values, const char* flow_uid,char* username)
+{
+ printf("DFL_WL_TO_CAPP方法开始执行,当前流程:%s的username==%s\n",flow_uid,username);
+ //char logFilePath[128] = "C:\\Users\\Administrator\\Desktop\\TC_LOG.txt";
+ //CreateLogFile(logFilePath);
- }
- 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");
+ char* log_file = NULL;
- }
- 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");
- }
+ printf("创建日志文件\n");
+ //char logFilePath[128] = "C:\\Users\\Administrator\\Desktop\\TC_LOG.txt";
+ //CreateLogFile(logFilePath, &log_file);
+
+ printf("===================================\n");
+ printf("WL to CAPP begin\n");
+ printf("===================================\n");
+
+ int ifail = ITK_ok;
+ printf("Open super privilege\n");
+ POM_AM__set_application_bypass(true);
+ //流程的状态
+ int status1 = 2;
+ int att_cnt = 0,
+ i = 0;
+ int attachmentCount = 0;
+ tag_t root_task_tag = NULLTAG,
+ *attachments;
+ tag_t rootTask = NULLTAG,
+ windowTag = NULLTAG,
+ topLineTag = NULLTAG;
+ tag_t executor;
+ tag_t query_tag1 = NULLTAG;
+ tag_t* attachmentTags = NULL,
+ revisionTag = NULLTAG,
+ itemTag = NULLTAG;
+ char* user_uid;
+ char dwg[] = "DWG";
+ char T2_dwg[] = "T2_DWG";
+ char AIDrawing[] = "AIDrawing";
+ char t2_AIDrawing[] = "T2_AIDrawing";
+ const char query_name_product[1][QRY_name_size_c + 1] = { "零组件版本" };
+ //uid转tag对象:将流程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 (ifail != ITK_ok) {
+ printf("this workflow is not exist!\n");
+ return ifail;
+ }
+ printf("》》》开始获取流程下的对象\n");
+//----------------------------------------------------------------------------------------------------------------------------
+ //获取流程下的对象数组-attachments
+ ITKCALL(EPM_ask_attachments(root, EPM_target_attachment, &att_cnt, &attachments));
+ printf("当前流程:%s 下的对象数量为:%d \n", flow_uid, att_cnt);
+ if (att_cnt > 0)
+ {
+ for (i = 0; i < att_cnt; i++) {
+ //获得流程下的物料版本对象kuma
+ revisionTag = attachments[i];
+ if (!isTypeOf(revisionTag, "ItemRevision")) {//如果不是版本对象,则跳过
+ printf("流程:%s 下的当前对象不是版本对象,跳过\n", flow_uid);
+ continue;
+ }
+ //根据流程目标下的版本对象,获取版本对象对应的item对象
+ ITKCALL(ITEM_ask_item_of_rev(revisionTag, &itemTag));
+
+ //TODO 判断流程目标下的版本对象是物料还是图纸
+ char* objType;
+ char* objName;
+ char* publishStatus;
+ char* classification;
+ date_t publishDate;
+ AOM_ask_value_string(revisionTag, "object_type", &objType);
+ AOM_ask_value_string(revisionTag, "object_name", &objName);
+ printf("SB当前流程下对象版本类型为:%s \n", objType);
+ //------------------------------《开始判断流程下的对象类型:物料or图纸》-----------------------------------------------------------------------------------------------------------
+ if (stricmp(objType, "H8_wuliaoRevision") == 0)//如果此流程下的当前对象为:物料版本
+ {
+ printf("当前流程下对象版本为物料版本\n");
+ // 进入BOM递归前存一次物料,在递归过程中只存子项物料即可
+ if (revisionTag != NULL)
+ {
+ savePart(revisionTag,username);
+ }
+ else
+ {
+ printf("当前流程下对象版本为空,无法保存物料信息到数据库");
+ }
+
+ //1.获取当前流程对象的bom行
+ //创建Window
+ BOM_create_window(&windowTag);
+ //设置顶层BOMline
+ BOM_set_window_top_line(windowTag, itemTag, revisionTag, NULLTAG, &topLineTag);
+
+ throughAllBom(topLineTag,username);
+ printf("》》》BOM递归结束");
+ //关闭BOMwindow
+ BOM_close_window(windowTag);
+ }else if (stricmp(objType, "H8_frockItemRevision") == 0 || stricmp(objType, "H8_drawingRevision") == 0 || stricmp(objType, "H8_frockItemRevision") == 0 || stricmp(objType, "H8_standardPartsRevision") == 0 || stricmp(objType, "H8_ComponentRevision") == 0)
+ {//如果此流程下的当前对象为:图纸版本
+ printf("当前流程下对象版本为图纸版本:%s \n",objType);
+ //校验发布状态,未发布则不执行并提示:当前版本未发布
+ AOM_ask_value_date(revisionTag, "date_released", &publishDate);
+ if (publishDate.year == NULL)
+ {
+ printf("当前版本未发布,不执行 \n");
+ return ifail;
+ }
+ else {
+ printf(">>>当前版本已发布,发布时间为: \n");
+ printf("Date: %04hd-%02hhd-%02hhd\n", publishDate.year, publishDate.month, publishDate.day);
+ printf("Time: %02hhd:%02hhd:%02hhd\n", publishDate.hour, publishDate.minute, publishDate.second);
+ }
+ //判断 密级程度
+ AOM_ask_value_string(revisionTag, "ip_classification", &classification);
+ if (stricmp(classification,"内部") == 0)
+ {
+ printf(">>>当前图纸为非密图纸,允许下发:%s \n", classification);
+ // 进入BOM递归前第一次存图纸,递归中再存一次给:将图纸版本对象属性以及表单属性记录到图纸数据表中
+ ITKCALL(ifail = saveDrawing(revisionTag,username));
+ }
+ else
+ {
+ printf(">>>当前图纸:%s为加密图纸,不允许下发:%s \n", objName, classification);
+ }
+ //1.获取当前流程对象的bom行
+ //创建Window
+ BOM_create_window(&windowTag);
+ //设置顶层BOMline
+ BOM_set_window_top_line(windowTag, itemTag, revisionTag, NULLTAG, &topLineTag);
+
+ throughAllBom(topLineTag,username);
+
+ //关闭BOMwindow
+ BOM_close_window(windowTag);
+ MEM_free(classification);
+
+ }else{
+ printf("不满足要求:流程 ==> %s 下的 %s 对象类型为:%s\n", flow_uid, objName, objType);
+ }
+ MEM_free(objName);
+ MEM_free(objType);
+ }
+ }else
+ {
+ printf("》》》流程下没有对象,无法执行");
+ }
+ MEM_free(attachments);
+
+ CloseLog();
+ return ifail;
+}
+
+/*分割MSG“000022-A”为两个部分*/
+int split_msg(const char* msg, char* item_id, char* item_revision_id) {
+ int ifail = ITK_ok;
+
+ char* buffer;
+ char* token;
+
+ // 计算字符串长度并分配足够的内存
+ size_t len = strlen(msg);
+ //buffer = malloc(len + 1); // +1 是为了容纳字符串终止符 '\0'
+ buffer = (char*)MEM_alloc(1028 * sizeof(char));
+ if (buffer == NULL) {
+ fprintf(stderr, "Memory allocation failed\n");
+ return 1;
+ }
+
+ // 复制字符串到缓冲区
+ strcpy(buffer, msg);
+
+ // 使用 strtok 分割字符串
+ token = strtok(buffer, "-");
+ if (token != NULL) {
+ strcpy(item_id, token);
+ printf("拆分得到item_id: %s\n", token); // 输出 "000022"
+ }
+ token = strtok(NULL, "-");
+ if (token != NULL) {
+ strcpy(item_revision_id, token);
+ printf("拆分msg得到item_revision_id: %s\n", token); // 输出 "A"
+ }
+
+ // 释放分配的内存
+ MEM_free(buffer);
+
+
+ return ifail;
+}
- //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)
+/*
+* (exe)服务:手动下发
+*/
+int SD_TO_CAPP(const char* msg,char* username)
+{
+ printf("》》》开始执行手动下发SD_TO_CAPP方法,接受到入参MSG==%s,username==%s\n",msg,username);
+ char* log_file = NULL;
+ int ifail = ITK_ok;
+ char* item_id = (char*)MEM_alloc(1028 * sizeof(char));
+ char* item_revision_id = (char*)MEM_alloc(1028 * sizeof(char));
+ ITKCALL(ifail = split_msg(msg, item_id, item_revision_id));
+ //1.通过MSG(“000022-A”)调用查询构建器获取具体的零组件版本对象
+ tag_t query = NULL;
+ int n_found;
+ ITKCALL(ifail = QRY_find2("CAPP_Serch", &query));
+ //ITKCALL(ifail = QRY_find2("零组件 ID", &query));
+ tag_t* tags;
+ tag_t windowTag;
+ tag_t itemTag;
+ tag_t topLineTag;
+ date_t publishDate;
+ boolean saveFlag = true;
+ char* qry_entries[2] = { "ItemI" ,"Revisio" },
+ * qry_values[2] = { item_id ,item_revision_id }, * errorId = "";
+ /*char* qry_entries[1] = { "零组件 ID"},
+ * qry_values[1] = { item_id }, * errorId = "";*/
+ char* classification;
+ if (query == NULL)
+ {
+ printf(">>>>>>>查询不到CAPP构建器对象!");
+ }
+ else
+ {
+ char* uid;
+ POM_tag_to_uid(query,&uid);
+ printf("uid======%s\n",uid);
+ printf(">>>>>查询到CAPP构建器对象,开始执行查询");
+ printf(">>>查询条目:零组件 ID==%s,版本==%s\n", item_id, item_revision_id);
+ }
+ ITKCALL(ifail = QRY_execute(query, 2, qry_entries, qry_values, &n_found, &tags));
+ printf("查询到%d个零组件版本结果\n", n_found);
+ if (n_found == 0)
+ {
+ printf("未找到对应的零组件版本对象,请检查MSG信息是否正确!");
+ return ifail;
+ }
+ else
+ {
+ for (int i = 0; i < n_found; i++) {
+ char* itemIdC;
+ char* item_revision_idC;
+ AOM_ask_value_string(tags[i], "item_id", &itemIdC);
+ AOM_ask_value_string(tags[i], "item_revision_id", &item_revision_idC);
+ printf("查询到的零组件版本对象==> %s - %s\n", itemIdC, item_revision_idC);
+
+ MEM_free(item_revision_idC);
+ MEM_free(itemIdC);
+ }
+
+ //-----------------------判断获取到的零组件版本对象tags[0](理论上只能查询出一个结果),是物料or图纸----------------
+ //2.根据版本对象获取版本类型
+ char* objType;
+ char* objName;
+ AOM_ask_value_string(tags[0], "object_type", &objType);
+ AOM_ask_value_string(tags[0], "object_name", &objName);
+ //根据版本对象,获取版本对象对应的item对象
+ ITKCALL(ITEM_ask_item_of_rev(tags[0], &itemTag));
+
+ //3.获取到版本类型:图纸版本/物料版本,分别复用上面自动下发的代码
+ if (stricmp(objType, "H8_wuliaoRevision") == 0)//如果此流程下的当前对象为:物料版本
+ {
+ printf("当前流程下对象版本为物料版本\n");
+ // 进入BOM递归前存一次物料,在递归过程中只存子项物料即可
+ if (tags[0] != NULL)
+ {
+ savePart(tags[0], username);
+ }
+ else
+ {
+ printf("当前流程下对象版本为空,无法保存物料信息到数据库");
+ }
+
+ //1.获取当前流程对象的bom行
+ //创建Window
+ BOM_create_window(&windowTag);
+ //设置顶层BOMline
+ BOM_set_window_top_line(windowTag, itemTag, tags[0], NULLTAG, &topLineTag);
+
+ throughAllBom(topLineTag, username);
+ printf("》》》BOM递归结束");
+ //关闭BOMwindow
+ BOM_close_window(windowTag);
+ }
+ else if (stricmp(objType, "H8_frockItemRevision") == 0 || stricmp(objType, "H8_drawingRevision") == 0 || stricmp(objType, "H8_frockItemRevision") == 0 || stricmp(objType, "H8_standardPartsRevision") == 0 || stricmp(objType, "H8_ComponentRevision") == 0)
+ {//如果此流程下的当前对象为:图纸版本
+ printf("当前流程下对象版本为图纸版本 \n");
+ //校验发布状态,未发布则不执行并提示:当前版本未发布
+ AOM_ask_value_date(tags[0], "date_released", &publishDate);
+ if (publishDate.year == NULL)
+ {
+ printf("当前版本未发布,不执行 \n");
+ return ifail;
+ }
+ else {
+ printf(">>>当前版本已发布,发布时间为: \n");
+ printf("Date: %04hd-%02hhd-%02hhd\n", publishDate.year, publishDate.month, publishDate.day);
+ printf("Time: %02hhd:%02hhd:%02hhd\n", publishDate.hour, publishDate.minute, publishDate.second);
+ }
+ //判断 密级程度
+ AOM_ask_value_string(tags[0], "ip_classification", &classification);
+ if (stricmp(classification, "内部") == 0)
+ {
+ printf(">>>当前图纸为非密图纸,允许下发:%s \n", classification);
+ // 进入BOM递归前第一次存图纸,递归中再存一次给:将图纸版本对象属性以及表单属性记录到图纸数据表中
+ ITKCALL(ifail = saveDrawing(tags[0], username));
+ }
+ else
+ {
+ printf(">>>当前图纸:%s为加密图纸,不允许下发:%s \n", objName, classification);
+ }
+ //1.获取当前流程对象的bom行
+ //创建Window
+ BOM_create_window(&windowTag);
+ //设置顶层BOMline
+ BOM_set_window_top_line(windowTag, itemTag, tags[0], NULLTAG, &topLineTag);
+
+ throughAllBom(topLineTag, username);
+
+ //关闭BOMwindow
+ BOM_close_window(windowTag);
+ MEM_free(classification);
+
+ }
+ else {
+ printf("不满足要求:当前MSG包含的 %s 对象类型为:%s\n", objName, objType);
+ }
+ MEM_free(objName);
+ MEM_free(objType);
+
+ }
+
+ MEM_free(tags);
+ return ifail;
+
+}
+
+int get_last_release_rev(tag_t itemTag, tag_t* revTag) {
+ int ifail = ITK_ok;
+ //获取版本
+ //tag_t revTag = NULLTAG;
+ int revisionNums = 0;
+ tag_t* revisionTags = NULLTAG;
+ //ITKCALL(ifail = AOM_ask_value_tags(itemTag, "revision_list", &revisionNums, &revisionTags));
+ ITKCALL(ITEM_list_all_revs(itemTag, &revisionNums, &revisionTags));
+ for (int k = revisionNums - 1; k >= 0; k--) {
+ int releaseNums = 0;
+ tag_t* releaseTags = NULLTAG;
+ ITKCALL(ifail = AOM_ask_value_tags(revisionTags[k], "release_status_list", &releaseNums, &releaseTags));
+ if (releaseNums > 0) {
+ *revTag = revisionTags[k];
+ }
+ MEM_free(releaseTags);
+ }
+
+ MEM_free(revisionTags);
+ return ifail;
+}
+
+
+/*
+* 变更通知单自动下发
+* @param msg 变更通知单的item_id
+* @param usernamev 下发用户名
+* TODO 尚未释放内存
+*/
+int DFL_CHANGE_TO_CAPP(char** c_sql_values, char* msg, char* usernamev) {
+ printf("》》》开始执行变更单下发DFL_CHANGE_TO_CAPP方法,接受到入参MSG==%s,username==%s\n", msg, usernamev);
+ int ifail = ITK_ok;
+ tag_t item = NULLTAG;
+ tag_t revTag = NULLTAG;
+ char* changeno;//更改通知单号1
+ tag_t user;//申请人
+ char* username = NULL;//申请人名称
+ char* solution;//解决方案项
+ char* version;//解决方案项版本
+ char* name;//更改单名称/概要
+ char* address = (char*)MEM_alloc(1028 * sizeof(char));//变更单通知单物理文件地址
+ char* issuedtime = (char*)MEM_alloc(1028 * sizeof(char));//下发时间1
+ char* updatetime = (char*)MEM_alloc(1028 * sizeof(char));//更新时间1
+ int pdcount = 0;
+ int count = 0;
+ tag_t* pdtags = NULLTAG;//“解决方案”项下的图纸and物料版本对象
+ tag_t* dataset_tags = NULLTAG;
+ char* origin_file_name = NULL,
+ * ref_file_name = NULL,
+ * ref_type = NULL,
+ * dataset_name = NULL;
+ int n_found;
+ tag_t* ref_object = NULL;
+ // 为年、月、日分配存储空间
+ char year[5]; // "yyyy" + null 终止符
+ char month[3]; // "MM" + null 终止符
+ char day[3]; // "dd" + null 终止符
+ char* ftp_ip = (char*)MEM_alloc(64 * sizeof(char));
+ char* ftp_user = (char*)MEM_alloc(64 * sizeof(char));
+ char* ftp_password = (char*)MEM_alloc(64 * sizeof(char));
+
+ // 1.获取变更通知单对象(变更单item_id获取对象)
+ ITKCALL(ifail = ITEM_find_item(msg, &item));
+ if (item == NULLTAG) {
+ printf(">>>提示:获取变更通知单对象失败!\n");
+ return ifail;
+ }
+
+ ITKCALL(ifail = AOM_ask_value_string(item, "item_id", &changeno));
+ ITKCALL(ifail = AOM_ask_value_tag(item, "owning_user", &user));
+ ITKCALL(ifail = AOM_ask_value_string(user, "user_name", &username));
+ ITKCALL(ifail = AOM_ask_value_string(item, "object_name", &name));
+ get_current_time(issuedtime);
+ get_current_time(updatetime);
+ //1.获取变更单下的最新发布版本-revTag
+ ITKCALL(ifail = get_last_release_rev(item, &revTag));
+ if (revTag == NULLTAG)
+ {
+ printf(">>>获取变更单下的最新发布版本失败!\n 不存在已发布的变更单版本!\n");
+ return ifail;
+ }
+ //获取变更通知单物理文件
+ //提取年月日组件
+ extract_date_components(issuedtime, year, month, day);
+
+ //处理“解决方案”文件夹下的图纸or物料,并获取BOM
+
+ //获取“解决方案”项下的图纸and物料版本对象,并遍历处理(遍历处理到“叶子结点”时存入数据库)
+ ITKCALL(ifail = AOM_ask_value_tags(revTag, "CMHasSolutionItem", &pdcount, &pdtags));
+ if (pdcount > 0)
+ {//“解决方案”项下有版本对象
+ for (int i = 0; i < pdcount; i++)
+ {
+ printf("================“解决方案”项下有版本对象 \n");
+ tag_t revisionTag = NULLTAG;
+ char* objType;
+ char* objName;
+ tag_t windowTag;
+ tag_t itemTag;
+ tag_t topLineTag;
+ date_t publishDate;
+ char* classification = NULL;
+
+
+ //判断物料or图纸pdtags[i];
+ revisionTag = pdtags[i];
+ ITKCALL(ifail = AOM_ask_value_string(revisionTag, "object_type", &objType));
+ ITKCALL(ifail = AOM_ask_value_string(revisionTag, "object_name", &objName));
+ ITKCALL(ifail = AOM_ask_value_string(revisionTag, "item_id", &solution));
+ ITKCALL(ifail = AOM_ask_value_string(revisionTag, "item_revision_id", &version));
+ ITKCALL(ifail = ITEM_ask_item_of_rev(revisionTag, &itemTag));
+ printf("=========================>>>>>>>>解决方案下的当前版本对象为::%s\n", objType);
+ if (stricmp(objType, "H8_wuliaoRevision") == 0)
+ {//如果当前对象为:物料版本
+ printf("当前对象版本:%s为物料版本 \n", objName);
+ if (revisionTag != NULLTAG)
+ {
+ savePart(revisionTag, usernamev);
+ }
+ BOM_create_window(&windowTag);
+ BOM_set_window_top_line(windowTag, itemTag, revisionTag, NULLTAG, &topLineTag);
+ throughAllBom(topLineTag, usernamev);
+ BOM_close_window(windowTag);
+
+ }
+ else if (stricmp(objType, "H8_frockItemRevision") == 0 || stricmp(objType, "H8_drawingRevision") == 0 || stricmp(objType, "H8_frockItemRevision") == 0 || stricmp(objType, "H8_standardPartsRevision") == 0 || stricmp(objType, "H8_ComponentRevision") == 0)
+ {
+ printf("当前对象版本:%s为图纸版本 \n", objName);
+ //校验发布状态,未发布则不执行并提示:当前版本未发布
+ AOM_ask_value_date(revisionTag, "date_released", &publishDate);
+ if (publishDate.year == NULL)
+ {
+ printf("当前版本未发布,不执行 \n");
+ return ifail;
+ }
+ else {
+ printf(">>>当前版本已发布,发布时间为: \n");
+ printf("Date: %04hd-%02hhd-%02hhd\n", publishDate.year, publishDate.month, publishDate.day);
+ printf("Time: %02hhd:%02hhd:%02hhd\n", publishDate.hour, publishDate.minute, publishDate.second);
+ }
+ //判断图纸密级程度
+ ITKCALL(ifail = AOM_ask_value_string(revisionTag, "ip_classification", &classification));
+ if (stricmp(classification, "内部") == 0) {
+ printf(">>>当前图纸为非密图纸,允许下发:%s \n", classification);
+ ITKCALL(ifail = saveDrawing(revisionTag, usernamev));
+ }
+ else
+ {
+ printf(">>>当前图纸为加密图纸,不允许下发:%s \n", classification);
+ }
+ //处理图纸对象的BOM
+ BOM_create_window(&windowTag);
+ BOM_set_window_top_line(windowTag, itemTag, revisionTag, NULLTAG, &topLineTag);
+ throughAllBom(topLineTag, usernamev);
+ BOM_close_window(windowTag);
+
+ MEM_free(classification);
+ }
+ else
+ {
+ WriteLog(">>>当前对象版本:%s类型为:%s,不满足条件,请核查!\n", objName, objType);
+ continue;
+ }
+ //============================ 3.保存(新增or更新)变更通知单信息到数据库表中
+ int outputValueCount,
+ outputColumn;
+ char*** result_values;
+ char sql_cx[1024] = "\0";
+ sprintf(sql_cx, "select ADDRESS from WHBH_CAPP_CHANGE where solution='%s' and version='%s' ", solution, version);
+ printf("提示:cxsql==%s\n", sql_cx);
+ if (QuerySQLNoInputParam(sql_cx, &outputColumn, &outputValueCount, &result_values) == -1) {
+ printf("提示:cxsql查询变更通知单信息失败\n");
+ return 1;
+ }
+ //--------------获取首选项中的FTP信息并与FTP建立连接----------------------------------------------------------------------------------------------------
+ //获取首选项中配置的连接FTP的IP地址、用户名、密码
+ int ftp_value_count = 0;
+ char** ftp_option_values;
+ //struct tm* lt2;
+ ITKCALL(PREF_ask_char_values("BH_CAPP_FTP", &ftp_value_count, &ftp_option_values));
+ if (ftp_value_count != 3)
+ {
+ printf("首选项配置项错误:配置数量==%d,请核查!\n", ftp_value_count);
+ return ifail;
+ }
+ printf("===>开始连接FTP服务器···");
+ //连接FTP服务器
+ HINTERNET hInternet = NULL, hFtpSession = NULL;
+ hInternet = InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
+ hFtpSession = InternetConnectA(hInternet, ftp_option_values[0], INTERNET_DEFAULT_FTP_PORT, ftp_option_values[1], ftp_option_values[2], INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
+ if (hFtpSession == NULL) {
+ printf("连接FTP服务器失败\n");
+ }
+ else
+ {
+ strcpy(ftp_ip, ftp_option_values[0]);
+ strcpy(ftp_user, ftp_option_values[1]);
+ strcpy(ftp_password, ftp_option_values[2]);
+ printf("连接FTP服务器成功\n");
+ }
+
+ if (outputValueCount == 0) {//不存在change原始数据
+ printf("提示:不存在变更通知单原始数据,新增变更通知单数据\n");
+ string Change_temp_path = "C:\\Change_temp\\";
+ string ftpFilePath = "/Change/";
+ ftpFilePath.append(year).append("/").append(month).append("/").append(day).append("/").append(changeno);
+ strcpy(address, ftpFilePath.c_str());//存储地址
+ printf(">>>=================变更通知单:%s的物理文件地址address:%s,ftpFilePath:%s\n", changeno, address, ftpFilePath.c_str());
+ //准备数据集存放目录:存放数据集要根据是否存在原始数据进行更新或新增
+ //clearDir(Change_temp_path);
+ ITKCALL(ifail = AOM_ask_value_tags(revTag, "IMAN_specification", &count, &dataset_tags));
+ if (count > 0) {
+ printf(">>>变更通知单:%s的“更改引用项”下物理文件的个数:%d\n", changeno, count);
+
+ DeleteLRDirectory(ftpFilePath.c_str());
+ //createFTPDir(hFtpSession, &ftpFilePath[0]);
+ for (int t = 0; t < count; t++)
+ {
+ ITKCALL(AOM_ask_value_string(dataset_tags[t], "current_name", &origin_file_name));
+ ITKCALL(AE_ask_dataset_named_refs(dataset_tags[i], &n_found, &ref_object));
+ printf("提示:数据集名称==%s,引用文件数量==%d\n", origin_file_name, n_found);
+ if (n_found > 0)
{
- WriteLog("提示:数据插入 失败, %s \n", sql4);
- return 1;
- }
- else {
- ExecuteSQLNoInputParam("commit");
+ for (int i = 0; i < n_found;i++) {
+ ITKCALL(AOM_ask_value_string(ref_object[i], "object_type", &ref_type));
+ printf("提示:当前引用文件类型==%s\n", ref_type);
+ if (strcmp(ref_type, "ImanFile") == 0) {
+ ITKCALL(AOM_ask_value_string(ref_object[i], "original_file_name", &ref_file_name));
+ if (ref_file_name != NULL && ref_file_name[0] != '\0') {
+ string final_exportName = Change_temp_path;
+ final_exportName.append(ref_file_name);
+ //导出当前数据集下存在的引用文件到服务器目录下
+ ITKCALL(ifail = IMF_export_file(ref_object[i], final_exportName.c_str()));
+
+ printf("=======OVER成功导出文件到本地缓存目录:%s======================== \n \n \n", final_exportName.c_str());
+ //参数2:原始文件路径,参数3:FTP服务器文件路径。两者都精确到具体的文件路径,形如:/Design/2022/01/25/000022-A/111.dwg
+ string final_ftpFilePath = ftpFilePath;
+ final_ftpFilePath.append("/").append(ref_file_name);
+
+ string ip = ftp_ip;
+ string user = ftp_user;
+ string password = ftp_password;
+ /*bool success = UploadFileToFtp(final_exportName,
+ ftpFilePath.append("/"),
+ ip,
+ user,
+ password);*/
+ bool success = uploadFileToMinIO(final_exportName, final_ftpFilePath);
+ if (success) {
+ printf("提示:FTP上传成功==%s\n", ftpFilePath.c_str());
+ }
+ else {
+ printf("提示:FTP上传失败==%s\n", ftpFilePath.c_str());
+ }
+
+ }
+ }
+ else {
+ printf("提示:数据集[%s]下ImanFile类型的引用文件中不存在origin_file_name属性,获取引用文件名失败!不导出文件\n", origin_file_name);
+ }
+ }
}
+
}
- 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)
+
+ MEM_free(ftp_password);
+ MEM_free(ftp_user);
+ MEM_free(ftp_ip);
+ }
+ //clearDir(Change_temp_path);
+ printf(">>>变更通知单导出完成!!!\n");
+ //插入数据
+ printf("提示:当前变更单不存在原始数据,开始插入\n");
+ char sql_insert_change[1024] = "\0";
+ sprintf(sql_insert_change, "insert into WHBH_CAPP_CHANGE(changeno,username,solution,version,name,address,issuedtime,updatetime) values('%s','%s','%s','%s','%s','%s','%s','%s')", changeno, username, solution, version, name, address, issuedtime, updatetime);
+ printf("提示:sql_insert_change==%s\n", sql_insert_change);
+ if (ExecuteSQLNoInputParam(sql_insert_change) == -1)
+ {
+ printf("提示:sql_insert_change数据插入 失败, %s \n", sql_insert_change);
+ return 1;
+ }
+ else {
+ ExecuteSQLNoInputParam("commit");
+ }
+ }
+ else {
+ printf("提示:存在变更通知单原始数据,更新变更通知单原始数据\n");
+ //准备数据集存放目录:存放数据集要根据是否存在原始数据进行更新或新增
+ string ftp_file_path = result_values[0][0];
+ string Change_temp_path = "C:\\Change_temp\\";
+ printf("============>更新变更单物理文件的存放路径为:%s \n", result_values[0][0]);
+ clearDir(Change_temp_path);
+ ITKCALL(ifail = AOM_ask_value_tags(revTag, "IMAN_specification", &count, &dataset_tags));
+ if (count > 0) {
+ printf(">>>变更通知单:%s的“更改引用项”下物理文件的个数:%d\n", changeno, count);
+ // 清空ftp上的ftpExportName目录下的所有文件,为下面循环遍历取得数据集存放做准备
+ DeleteLRDirectory(ftp_file_path.c_str());
+ //在FTP上提前创建存放数据集文件的文件夹,ftpFilePath路径形如:/Design/2022/01/25/000022-A/
+ ftp_file_path.append("/");
+ //ITKCALL(ifail = createFTPDir(hFtpSession, &ftp_file_path[0]));
+ for (int t = 0; t < count; t++)
+ {
+ ITKCALL(AOM_ask_value_string(dataset_tags[t], "current_name", &dataset_name));
+ ITKCALL(AE_ask_dataset_named_refs(dataset_tags[i], &n_found, &ref_object));
+ printf("提示:数据集名称==%s,引用文件数量==%d\n", dataset_name, n_found);
+ if (n_found > 0)
{
- WriteLog("提示:数据插入 失败, %s \n", sql5);
- return 1;
- }
- else {
- ExecuteSQLNoInputParam("commit");
+ for (int i = 0; i < n_found;i++) {
+ ITKCALL(AOM_ask_value_string(ref_object[i], "object_type", &ref_type));
+ //ITKCALL(AOM_ask_value_string(ref_object[i], "file_size", &file_size));
+
+ printf("提示:当前引用文件类型==%s\n", ref_type);
+ if (strcmp(ref_type, "ImanFile") == 0) {
+ ITKCALL(AOM_ask_value_string(ref_object[i], "original_file_name", &ref_file_name));
+
+ if (ref_file_name != NULL && ref_file_name[0] != '\0') {
+ string final_change_temp_path = Change_temp_path;
+ final_change_temp_path.append(ref_file_name);
+ //导出当前数据集下存在的引用文件到服务器目录下
+ ITKCALL(ifail = IMF_export_file(ref_object[i], final_change_temp_path.c_str()));
+ printf("=======OVER成功导出文件到本地缓存目录:%s======================== \n \n \n", final_change_temp_path.c_str());
+ string ftpFilePath = ftp_file_path;
+ ftpFilePath.append(ref_file_name);
+
+ string ip = ftp_ip;
+ string user = ftp_user;
+ string password = ftp_password;
+ /*bool success = UploadFileToFtp(final_change_temp_path,
+ ftp_file_path,
+ ip,
+ user,
+ password);*/
+ bool success = uploadFileToMinIO(final_change_temp_path, ftpFilePath);
+ if (success) {
+ printf("提示:FTP上传成功==%s\n", ftpFilePath.c_str());
+ }
+ else {
+ printf("提示:FTP上传失败==%s\n", ftpFilePath.c_str());
+ }
+
+ }
+ else
+ {
+ printf("提示:数据集:【%s】下的引用文件[%d]不存在“original_file_name”属性,获取引用文件名称失败,无法导出文件\n", origin_file_name,i);
+ }
+
+ }
+
+ }
+
}
}
+
+ MEM_free(ftp_password);
+ MEM_free(ftp_user);
+ MEM_free(ftp_ip);
+
+
+ }
+ //clearDir(Change_temp_path);
+ printf(">>>变更通知单导出完成!!!\n");
+ //更新数据
+ printf("提示:当前变更单存在原始数据,开始更新\n");
+ char sql_update_change[1024] = "\0";
+ sprintf(sql_update_change, "update WHBH_CAPP_CHANGE set changeno = '%s',username = '%s',name = '%s',updatetime = '%s' where solution = '%s' and version = '%s'", changeno, username, name, updatetime, solution, version);
+ printf("提示:sql_update_change==%s\n", sql_update_change);
+ if (ExecuteSQLNoInputParam(sql_update_change) == -1)
+ {
+ printf("提示:sql_update_change数据插入 失败, %s \n", sql_update_change);
+ return 1;
}
- curl_easy_cleanup(curl);
+ else {
+ ExecuteSQLNoInputParam("commit");
}
-
}
-
+ MEM_free(version);
+ MEM_free(solution);
+ MEM_free(objName);
+ MEM_free(objType);
+ cout << "Closing FTP Session" << endl;
+ InternetCloseHandle(hFtpSession);
+ cout << "Closing connection" << endl;
+ InternetCloseHandle(hInternet); // Close hInternet
}
-
-
- POM_AM__set_application_bypass(false);
- WriteLog("===================================\n");
- WriteLog("WL to SRM end\n");
- WriteLog("===================================\n");
+ }
+ MEM_free(ref_file_name);
+ MEM_free(ref_type);
+ MEM_free(ref_object);
+ MEM_free(dataset_name);
+ MEM_free(dataset_tags);
+ MEM_free(pdtags);
+ MEM_free(name);
+ MEM_free(username);
+ MEM_free(changeno);
+ CloseLog();
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);
+ char log_path[128] = "C:\\Temp\\KUMA_LOG.txt";
+ CreateLogFile(log_path, &log_file);
int ifail = ITK_ok;
int len;
int outputValueCount;
char* pbuf = NULL;
- char* tc_name, *tc_pwd, *tc_group;
+ char* tc_name, * tc_pwd, * tc_group;
int c_sql_value_count = 0;
- char** option_values;
+ char** option_values = NULL;
+
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* msg = 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);
+ char* msgv = NULL;
+ char*** flowUID_values = NULL;
+ char*** taskSource_values = NULL;
+ char*** outputValue = NULL;
+ int countResultNum;
+ char* connIP = (char*)MEM_alloc(32 * sizeof(char));
+ printf("name= %s\n", tc_name);
+ printf("pwd= %s\n", tc_pwd);
+ printf("group= %s\n", tc_group);
+ ifail = TC_init_module(tc_name, tc_pwd, tc_group);//初始化 Integration Tool Kit (ITK),并同时登录到 POM。
if (ifail != ITK_ok) {
- WriteLog("login fail! \n");
+ printf("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;
+ else{
+ printf("login>>>>> \n");
}
-
- 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"
+ //获取首选项的值:连接数据库的参数
+ ITKCALL(PREF_ask_char_values("BH_CAPP_Oracle", &c_sql_value_count, &option_values));
+ if (c_sql_value_count != 4)
{
- WriteLog("Info: Failed to access the data table\n");
- return NULL;
+ printf("BH_CAPP_Oracle 首选项配置异常!\n");
+ /*ITK_exit_module(true);
+ return ifail;*/
}
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)
+ //组织连接数据库的ip和服务名
+ strcpy(connIP, option_values[0]);
+ strcat(connIP, "/");
+ strcat(connIP, option_values[1]);
+ WriteLog("连接数据库的IP和端口为:%s\n", connIP);
+ printf("===================================\n");
+ printf("get flowUID begin\n");
+ printf("===================================\n");
+ int outputColumn = 0;
+ POM_AM__set_application_bypass(true);
+ if (ConnServer(option_values[2], option_values[3], connIP))//"tc11","infodba","//172.16.50.40/tc11" "TC12","infodba","172.16.68.13/tc1"
{
- WriteLog("Info: Failed to query the process UID. %s \n", sql_cx);
- return NULL;
+ printf("Info: Failed to access the data table\n");
+
}
- if (outputValueCount <= 0) {
- WriteLog("Info:Workflow data was not queried!\n");
- DisConnServer();
- return NULL;
+ else {
+ //连接数据库成功时
+ printf("Info: The data table is accessed successfully\n");
+
+ //查询本次下发的(未完成Task的)来源
+ char sql_getSource[1024] = "\0";
+ sprintf(sql_getSource, "select TASKSOURCE,FLOWID,MSG from WHBH_CAPP_TASK where status = '未开始' ORDER BY code DESC");
+ printf("Info:sql_getSource==%s\n", sql_getSource);
+ int outputColumnS = 0;
+ int outputValueCountS = 0;
+ if (QuerySQLNoInputParam(sql_getSource, &outputColumnS, &outputValueCountS, &taskSource_values) == -1)
+ {
+ printf("Info: 查询TASKSOURCE任务来源失败. %s \n", sql_getSource);
+
+ }
+ else
+ {
+ if (outputValueCountS <= 0) {
+ printf("Info:未查到任何待处理的任务!\n");
+
+ }
+ else
+ {
+ printf("Info: 查询任务来源成功!\n");
+ for (int t = 0; t < outputValueCountS; t++)
+ {
+ printf("taskSource_values[%d][0]=%s\n", t, taskSource_values[t][0]);
+ if (stricmp(taskSource_values[t][0], "工作流程") == 0)
+ {
+ WriteLog("Info:查询结果依次为任务来源 = %s,流程ID = %s,MSG = %s \n", taskSource_values[t][0], taskSource_values[t][1], taskSource_values[t][2]);
+ if (strlen(taskSource_values[t][2]) != 0) {
+ //自动下发=》存在msg=》说明是:变更通知单自动下发(因为只有变更通知单的任务来源为“工作流程”但存在msg)
+ WriteLog("Info:当前异步任务存在流程ID==%s和MSG==%s,任务来源:变更通知单自动下发!\n", taskSource_values[t][1], taskSource_values[t][2]);
+ msgv = taskSource_values[t][2];
+ if (msgv == NULL || strlen(taskSource_values[t][2]) == 0)
+ {
+ printf("》》》ERROR变更通知单数据异常:Task表中的msg为空,无法下发!请核查%s流程数据\n", taskSource_values[t][1]);
+
+ }
+ else
+ {
+ //查询下发发起人作为参数和msg中携带的变更通知单id一起传递给下发函数
+ char sql_getUser[1024] = "\0";
+ sprintf(sql_getUser, "select username from WHBH_CAPP_TASK where msg = '%s'", msgv);
+ printf("Info:sql_getUser==%s\n", sql_getUser);
+ int outputValueCountU = 0;
+ int outputColumnU = 0;
+ char*** username_values = NULL;
+ if (QuerySQLNoInputParam(sql_getUser, &outputColumnU, &outputValueCountU, &username_values) == -1) {
+ printf("Info: 查询用户名失败. %s \n", sql_getUser);
+
+ }else {
+ if (outputValueCountU <= 0) {
+ printf("Info:当前变更通知单Task:%s不存在username!\n", msgv);
+
+ }
+ else
+ {
+ char* username = username_values[0][0];
+ printf("Info:当前变更通知单:%s的username是:%s!\n开始执行下发逻辑···", msgv, username);
+ ITKCALL(ifail = DFL_CHANGE_TO_CAPP(option_values, msgv, username));
+ //下发完成,更新状态为已完成
+ //---------------------------------------------------------根据msg更新状态和完成时间----------------------------
+ char* currentTime = (char*)MEM_alloc(1028 * sizeof(char));
+ get_current_time(currentTime);
+ char sql_changeStatus[1024] = "\0";
+ sprintf(sql_changeStatus, "update WHBH_CAPP_TASK set STATUS='%s',ENDINGTIME='%s' where MSG='%s'", "已完成", currentTime, msgv);
+ printf("提示:sql_changeStatus==%s \n", sql_changeStatus);
+ if (ExecuteSQLNoInputParam(sql_changeStatus) == -1) {
+ printf("》》》异常提示:更新流程状态失败!sql_changeStatus == %s\n", sql_changeStatus);
+
+ }
+ else {
+ printf("》》》提示:更新流程状态成功!sql_changeStatus == %s\n", sql_changeStatus);
+ ExecuteSQLNoInputParam("commit");
+ }
+ }
+
+ }
+ }
+
+ }
+ else
+ {//自动下发,但不存在msg,说明是:图纸or物料自动下发
+ flowuid = taskSource_values[t][1];
+ char* currentTime = (char*)MEM_alloc(1028 * sizeof(char));
+
+ printf("开始处理未完成状态的流程-flowUID is:%s\n", flowuid);
+ char sql_getUser[1024] = "\0";
+ sprintf(sql_getUser, "select username from WHBH_CAPP_TASK where flowid = '%s'", flowuid);
+ printf("Info:sql_getUser==%s\n", sql_getUser);
+ int outputValueCountU = 0;
+ int outputColumnU = 0;
+ char*** username_values = NULL;
+ if (QuerySQLNoInputParam(sql_getUser, &outputColumnU, &outputValueCountU, &username_values) == -1) {
+ printf("Info: 查询用户名失败. %s \n", sql_getUser);
+
+ }
+ else {
+ if (outputValueCountU <= 0) {
+ printf("Info:当前流程:%s不存在username!\n", flowuid);
+
+ }
+ else
+ {
+ char* username = username_values[0][0];
+ printf("Info:当前流程:%s的username是:%s\n", flowuid, username);
+ ITKCALL(ifail = DFL_WL_TO_CAPP(option_values, flowuid, username));
+ //下发完成,更新状态为已完成
+ printf("》》》处理未完成状态的流程-flowUID is:%s 结束\n", flowuid);
+ ITKCALL(ifail = setAttrForTask(flowuid, "STATUS", "已完成"));
+ get_current_time(currentTime);
+ ITKCALL(ifail = setAttrForTask(flowuid, "ENDINGTIME", currentTime));
+ }
+ }
+ }
+ }
+ else if (stricmp(taskSource_values[t][0], "手动下发") == 0)
+ {
+ printf("》》》任务类型:手动下发");
+ //1.查询数据,获取手动下发的未完成任务中的MSG
+ msg = taskSource_values[t][2];
+ printf("》》》手动下发的未完成任务中的MSG是:%s\n", msg);
+
+ char sql_getUser[1024] = "\0";
+ sprintf(sql_getUser, "select username from WHBH_CAPP_TASK where msg = '%s'", msg);
+ printf("Info:sql_getUser==%s\n", sql_getUser);
+ int outputValueCountU = 0;
+ int outputColumnU = 0;
+ char*** username_values = NULL;
+ if (QuerySQLNoInputParam(sql_getUser, &outputColumnU, &outputValueCountU, &username_values) == -1) {
+ printf("Info: 查询用户名失败. %s \n", sql_getUser);
+
+ }else {
+ if (outputValueCountU <= 0) {
+ printf("Info:当前流程:%s不存在username!\n", flowuid);
+
+ }
+ else
+ {
+ char* username = username_values[0][0];
+ ITKCALL(ifail = SD_TO_CAPP(msg, username));
+ //---------------------------------------------------------根据msg更新状态和完成时间----------------------------
+ char* currentTime = (char*)MEM_alloc(1028 * sizeof(char));
+ get_current_time(currentTime);
+ char sql_changeStatus[1024] = "\0";
+ sprintf(sql_changeStatus, "update WHBH_CAPP_TASK set STATUS='%s',ENDINGTIME='%s' where MSG='%s'", "已完成", currentTime, msg);
+ printf("提示:sql_changeStatus==%s \n", sql_changeStatus);
+ if (ExecuteSQLNoInputParam(sql_changeStatus) == -1) {
+ printf("》》》异常提示:更新流程状态失败!sql_changeStatus == %s\n", sql_changeStatus);
+
+ }
+ else {
+ printf("》》》提示:更新流程状态成功!sql_changeStatus == %s\n", sql_changeStatus);
+ ExecuteSQLNoInputParam("commit");
+ }
+ MEM_free(currentTime);
+ }
+ }
+ }
+ else {
+ printf("当前任务来源异常:%s,无法执行下发操作!\n", taskSource_values[t][0]);
+
+ }
+ }
+ MEM_free(option_values);
+ }
+ }
}
- 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");
-
+ DisConnServer();
+ POM_AM__set_application_bypass(false);
}
-
- 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();
+ ITK_exit_module(true);
return ifail;
}
@@ -860,3 +2482,4 @@ int ITK_user_main(int argc, char* argv[])
+
diff --git a/DFL_WL_BOM_TOERP/common_itk_util.h b/DFL_WL_BOM_TOERP/common_itk_util.h
index f27d079..640e412 100644
--- a/DFL_WL_BOM_TOERP/common_itk_util.h
+++ b/DFL_WL_BOM_TOERP/common_itk_util.h
@@ -27,7 +27,6 @@ void ECHO(char *format, ...);
void CreateLogFile(char* FunctionName, char **fullname);
void WriteLog(const char* format, ...);
void CloseLog(void);
-void set_bypass(logical bypass);
//int FindDatasetReferenceExt( tag_t datasettype, const char *datasettype_ref, char ext[10] );
//int CompareDate( date_t date1, date_t date2 );
//int GetRandomTempFile( char tempFile[256] );
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOERP.log b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOERP.log
index 84a7ea4..b515a9f 100644
--- a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOERP.log
+++ b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOERP.log
@@ -1,47 +1,52 @@
-C:\VS2019\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(513,5): warning MSB8028: 中间目录(x64\Release\)包含从另一个项目(DFL_WL_BOM_TOERP.vcxproj)共享的文件。 这会导致错误的清除和重新生成行为。
- cJSON.c
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\cJSON.c(145,32): warning C4267: “return”: 从“size_t”转换到“int”,可能丢失数据
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\cJSON.c(261,18): warning C4244: “=”: 从“__int64”转换到“int”,可能丢失数据
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\cJSON.c(483,51): warning C4267: “+=”: 从“size_t”转换到“int”,可能丢失数据
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\cJSON.c(626,80): warning C4267: “+=”: 从“size_t”转换到“int”,可能丢失数据
- common_itk_util.c
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\common_itk_util.c(90,28): warning C4013: “AM__set_application_bypass”未定义;假设外部返回 int
+D:\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(513,5): warning MSB8028: 中间目录(x64\Release\)包含从另一个项目(DFL_WL_BOM_TOERP.vcxproj)共享的文件。 这会导致错误的清除和重新生成行为。
+ ado.cxx
+ curlToFtp.cpp
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(32,16): warning C4477: “printf”: 格式字符串“%f”需要类型“double”的参数,但可变参数 1 拥有了类型“curl_off_t”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): warning C4477: “printf”: 格式字符串“%ld”需要类型“long”的参数,但可变参数 1 拥有了类型“curl_off_t”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%lld”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%Id”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%I64d”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): warning C4477: “printf”: 格式字符串“%ld”需要类型“long”的参数,但可变参数 2 拥有了类型“curl_off_t”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%lld”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%Id”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%I64d”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): warning C4477: “printf”: 格式字符串“%ld”需要类型“long”的参数,但可变参数 3 拥有了类型“curl_off_t”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%lld”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%Id”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%I64d”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): warning C4477: “printf”: 格式字符串“%ld”需要类型“long”的参数,但可变参数 4 拥有了类型“curl_off_t”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%lld”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%Id”
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\curlToFtp.cpp(36,12): message : 请考虑在格式字符串中使用“%I64d”
DFL_WL_BOM_TOSRM.cpp
-D:\Clibs\12\include\pom\pom\pom.h(806,1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
-D:\Clibs\12\include\pom\pom\pom.h(5417,1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
-D:\Clibs\12\include_cpp\base_utils\IFail.hxx(114,17): warning C4251: “IFail::m_message”: class“std::basic_string,std::allocator>”需要有 dll 接口由 class“IFail”的客户端使用
-C:\VS2019\VC\Tools\MSVC\14.29.30133\include\xstring(4871): message : 参见“std::basic_string,std::allocator>”的声明
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(338,9): warning C4476: "printf": 格式说明符中的类型字段字符“Y”未知
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(338,9): warning C4476: "printf": 格式说明符中的类型字段字符“m”未知
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(338,9): warning C4473: “printf”: 没有为格式字符串传递足够的参数
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(338,9): message : 占位符和其参数预计 2 可变参数,但提供的却是 0 参数
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(338,9): message : 缺失的可变参数 1 为格式字符串“%d”所需
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(340,9): warning C4476: "printf": 格式说明符中的类型字段字符“Y”未知
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(340,9): warning C4476: "printf": 格式说明符中的类型字段字符“m”未知
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(340,9): warning C4473: “printf”: 没有为格式字符串传递足够的参数
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(340,9): message : 占位符和其参数预计 2 可变参数,但提供的却是 0 参数
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(340,9): message : 缺失的可变参数 1 为格式字符串“%d”所需
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(597,8): warning C4476: "printf": 格式说明符中的类型字段字符“Y”未知
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(597,8): warning C4476: "printf": 格式说明符中的类型字段字符“m”未知
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(597,8): warning C4473: “printf”: 没有为格式字符串传递足够的参数
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(597,8): message : 占位符和其参数预计 2 可变参数,但提供的却是 0 参数
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(597,8): message : 缺失的可变参数 1 为格式字符串“%d”所需
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(599,8): warning C4476: "printf": 格式说明符中的类型字段字符“Y”未知
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(599,8): warning C4476: "printf": 格式说明符中的类型字段字符“m”未知
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(599,8): warning C4473: “printf”: 没有为格式字符串传递足够的参数
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(599,8): message : 占位符和其参数预计 2 可变参数,但提供的却是 0 参数
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(599,8): message : 缺失的可变参数 1 为格式字符串“%d”所需
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(135,8): warning C4101: “executor”: 未引用的局部变量
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(185,9): warning C4101: “group_name1”: 未引用的局部变量
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(137,8): warning C4101: “user_uid”: 未引用的局部变量
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(186,10): warning C4101: “creDate”: 未引用的局部变量
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(782,6): warning C4101: “len”: 未引用的局部变量
+C:\environment\Teamcenter-ENV\ITK_Configuration_File\tc12ITK\tc12ITK\dflittk\include\pom\pom\pom.h(806,1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
+C:\environment\Teamcenter-ENV\ITK_Configuration_File\tc12ITK\tc12ITK\dflittk\include\pom\pom\pom.h(5417,1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
+C:\environment\Teamcenter-ENV\ITK_Configuration_File\tc12ITK\tc12ITK\dflittk\include_cpp\base_utils\IFail.hxx(114,17): warning C4251: “IFail::m_message”: class“std::basic_string,std::allocator>”需要有 dll 接口由 class“IFail”的客户端使用
+D:\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xstring(4871): message : 参见“std::basic_string,std::allocator>”的声明
+ The contents of are available only with C++17 or later.
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(781,8): warning C4101: “userid”: 未引用的局部变量
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(970,5): warning C4101: “userid”: 未引用的局部变量
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(1372,8): warning C4101: “user”: 未引用的局部变量
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(1530,8): warning C4101: “executor”: 未引用的局部变量
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(1535,8): warning C4101: “user_uid”: 未引用的局部变量
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(1570,10): warning C4101: “publishStatus”: 未引用的局部变量
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(2249,6): warning C4101: “len”: 未引用的局部变量
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(2250,6): warning C4101: “outputValueCount”: 未引用的局部变量
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\DFL_WL_BOM_TOSRM.cpp(2266,6): warning C4101: “countResultNum”: 未引用的局部变量
ocilib.cpp
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\ocilib.cpp(158,5): warning C4267: “参数”: 从“size_t”转换到“ub4”,可能丢失数据
-D:\source\东富龙\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\ocilib.cpp(181,5): warning C4267: “参数”: 从“size_t”转换到“ub4”,可能丢失数据
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\ocilib.cpp(158,5): warning C4267: “参数”: 从“size_t”转换到“ub4”,可能丢失数据
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\ocilib.cpp(181,5): warning C4267: “参数”: 从“size_t”转换到“ub4”,可能丢失数据
+ WininetHttp.cpp
+ cJSON.c
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\cJSON.c(145,32): warning C4267: “return”: 从“size_t”转换到“int”,可能丢失数据
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\cJSON.c(261,18): warning C4244: “=”: 从“__int64”转换到“int”,可能丢失数据
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\cJSON.c(483,51): warning C4267: “+=”: 从“size_t”转换到“int”,可能丢失数据
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\cJSON.c(626,80): warning C4267: “+=”: 从“size_t”转换到“int”,可能丢失数据
+ common_itk_util.c
+E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\DFL_WL_BOM_TOERP\common_itk_util.c(90,28): warning C4013: “AM__set_application_bypass”未定义;假设外部返回 int
正在生成代码
Previous IPDB not found, fall back to full compilation.
- All 210 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
+ All 239 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
已完成代码的生成
-itk_main.obj : warning LNK4099: 未找到 PDB“vc150.pdb”(使用“itk_main.obj”或在“D:\source\东富龙\DFL_WL_BOM_TOSRM\x64\Release\vc150.pdb”中寻找);正在链接对象,如同没有调试信息一样
- DFL_WL_BOM_TOERP.vcxproj -> D:\source\东富龙\DFL_WL_BOM_TOSRM\x64\Release\DFL_WL_BOM_TOSRM.exe
+itk_main.obj : warning LNK4099: 未找到 PDB“”(使用“itk_main.obj”或在“”中寻找);正在链接对象,如同没有调试信息一样
+ DFL_WL_BOM_TOERP.vcxproj -> E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\x64\Release\BH_BOM_TOCAPP.exe
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.Build.CppClean.log b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.Build.CppClean.log
index a951f2b..76ee4e7 100644
--- a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.Build.CppClean.log
+++ b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.Build.CppClean.log
@@ -1,15 +1,19 @@
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\vc142.pdb
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\common_itk_util.obj
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\cjson.obj
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\ocilib.obj
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.obj
-d:\source\东富龙\dfl_wl_bom_tosrm\x64\release\dfl_wl_bom_tosrm.exe
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.ipdb
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.iobj
-d:\source\东富龙\dfl_wl_bom_tosrm\x64\release\dfl_wl_bom_tosrm.pdb
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\cl.command.1.tlog
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\cl.read.1.tlog
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\cl.write.1.tlog
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\link.command.1.tlog
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\link.read.1.tlog
-d:\source\东富龙\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\link.write.1.tlog
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\vc142.pdb
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\ocilib.obj
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.obj
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\curltoftp.obj
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\ado.obj
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\common_itk_util.obj
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\cjson.obj
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\x64\release\dfl_wl_bom_tosrm.exe
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.ipdb
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.iobj
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\x64\release\dfl_wl_bom_tosrm.pdb
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\msado15.tli
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\msado15.tlh
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\cl.command.1.tlog
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\cl.read.1.tlog
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\cl.write.1.tlog
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\link.command.1.tlog
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\link.read.1.tlog
+e:\itk_workspace\itk\滨湖\bh_exe\dfl_wl_bom_tosrm\dfl_wl_bom_toerp\x64\release\dfl_wl_bom_tosrm.tlog\link.write.1.tlog
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.exe.recipe b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.exe.recipe
index 93daf1e..6b1bb32 100644
--- a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.exe.recipe
+++ b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.exe.recipe
@@ -2,7 +2,7 @@
- D:\source\东富龙\DFL_WL_BOM_TOSRM\x64\Release\DFL_WL_BOM_TOSRM.exe
+ E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\x64\Release\DFL_WL_BOM_TOSRM.exe
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.iobj b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.iobj
deleted file mode 100644
index 31d9adb..0000000
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.iobj and /dev/null differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.ipdb b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.ipdb
deleted file mode 100644
index 24313ad..0000000
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.ipdb and /dev/null differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.obj b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.obj
index af5c881..88b8a26 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.obj and b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.obj differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.command.1.tlog b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.command.1.tlog
index 4c2ae3e..9aaacd7 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.command.1.tlog and b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.command.1.tlog differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.read.1.tlog b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.read.1.tlog
index 709fc8f..9c4ad89 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.read.1.tlog and b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.read.1.tlog differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.write.1.tlog b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.write.1.tlog
index 9f3636b..a244d6f 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.write.1.tlog and b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/CL.write.1.tlog differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/DFL_WL_BOM_TOSRM.lastbuildstate b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/DFL_WL_BOM_TOSRM.lastbuildstate
index 90015c7..2299877 100644
--- a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/DFL_WL_BOM_TOSRM.lastbuildstate
+++ b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/DFL_WL_BOM_TOSRM.lastbuildstate
@@ -1,2 +1,2 @@
-PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:VCServicingVersionMFC=14.29.30136:TargetPlatformVersion=10.0.19041.0:
-Release|x64|D:\source\东富龙\DFL_WL_BOM_TOSRM\|
+PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:TargetPlatformVersion=10.0.19041.0:
+Release|x64|E:\ITK_WorkSpace\ITK\滨湖\BH_exe\DFL_WL_BOM_TOSRM\|
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.command.1.tlog b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.command.1.tlog
index 40e6814..4440141 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.command.1.tlog and b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.command.1.tlog differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.read.1.tlog b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.read.1.tlog
index a2c285c..a4967e0 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.read.1.tlog and b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.read.1.tlog differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.write.1.tlog b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.write.1.tlog
index 67379f4..9dfb239 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.write.1.tlog and b/DFL_WL_BOM_TOERP/x64/Release/DFL_WL_BOM_TOSRM.tlog/link.write.1.tlog differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/cJSON.obj b/DFL_WL_BOM_TOERP/x64/Release/cJSON.obj
index 31a8ae6..4a4b434 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/cJSON.obj and b/DFL_WL_BOM_TOERP/x64/Release/cJSON.obj differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/common_itk_util.obj b/DFL_WL_BOM_TOERP/x64/Release/common_itk_util.obj
index b7198c2..51da463 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/common_itk_util.obj and b/DFL_WL_BOM_TOERP/x64/Release/common_itk_util.obj differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/ocilib.obj b/DFL_WL_BOM_TOERP/x64/Release/ocilib.obj
index 2ff3780..75ab37e 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/ocilib.obj and b/DFL_WL_BOM_TOERP/x64/Release/ocilib.obj differ
diff --git a/DFL_WL_BOM_TOERP/x64/Release/vc142.pdb b/DFL_WL_BOM_TOERP/x64/Release/vc142.pdb
index bdc70df..4d45d57 100644
Binary files a/DFL_WL_BOM_TOERP/x64/Release/vc142.pdb and b/DFL_WL_BOM_TOERP/x64/Release/vc142.pdb differ
diff --git a/x64/Release/DFL_WL_BOM_TOSRM.exe b/x64/Release/DFL_WL_BOM_TOSRM.exe
deleted file mode 100644
index 1f93a24..0000000
Binary files a/x64/Release/DFL_WL_BOM_TOSRM.exe and /dev/null differ
diff --git a/x64/Release/DFL_WL_BOM_TOSRM.pdb b/x64/Release/DFL_WL_BOM_TOSRM.pdb
deleted file mode 100644
index 1ec7463..0000000
Binary files a/x64/Release/DFL_WL_BOM_TOSRM.pdb and /dev/null differ