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

464 lines
14 KiB

This file contains ambiguous Unicode characters!

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

#pragma warning (disable: 4996)
#pragma warning (disable: 4819)
#pragma warning (disable: 4995)
#include <tc/tc.h>
#include "mdbks_register.h"
#include <ict/ict_userservice.h>
#include <tccore/custom.h>
#include <epm/epm_toolkit_tc_utils.h>
#include <tccore/aom.h>
#include <tccore/aom_prop.h>
#include <tccore/item.h>
#include <bom/bom.h>
#include "ps/ps.h";
#include "ps/vrule.h"
#include "sstream"
#include <tccore/grm.h>
#include "epm/epm.h"
#include "sa/sa.h"
#include "libxl.h"
#include <map>
#include "epm/signoff.h"
#include <ctime>
#include <vector>
#include <locale>
#include <codecvt>
#include "ae/dataset.h"
#include <iostream>
#include <stdlib.h>
#include <tccore/aom.h>
#include <tc/emh.h>
#include <ict/ict_userservice.h>
#include <tc/tc.h>
#include <tccore/tctype.h>
#include <sa/tcfile.h>
#include <ss/ss_errors.h>
#include <string.h>
#include <time.h>
#include <tccore/project.h>
#include "tchar.h"
#include <ics/ics.h>
#include "ocilib.h"
#include <tc/preferences.h>
#include<winsock.h>
#include<iostream>
#include<string>
using namespace std;
//#pragma comment(lib, "WS2_32.lib")
#pragma comment(lib, "WSOCK32.lib")
extern "C" int POM_AM__set_application_bypass(logical bypass);
// 比较两个由 char* 表示的纯数字字符串的大小
// 返回值:
// 1 : str1 > str2
// 0 : str1 == str2
// -1 : str1 < str2
int compareNumericStrings(const char* str1, const char* str2) {
// 处理空指针
if (!str1 || !str2) {
std::cerr << "Error: Null pointer provided." << std::endl;
return 0; // 或者抛出异常
}
int len1 = strlen(str1);
int len2 = strlen(str2);
// 跳过前导零,找到第一个非零字符的位置
int i = 0, j = 0;
while (i < len1 && str1[i] == '0') i++;
while (j < len2 && str2[j] == '0') j++;
// 计算有效数字长度
int effectiveLen1 = len1 - i;
int effectiveLen2 = len2 - j;
// 首先比较有效数字的长度
if (effectiveLen1 > effectiveLen2) return 1;
if (effectiveLen1 < effectiveLen2) return -1;
// 长度相同,逐位比较
while (i < len1 && j < len2) {
if (str1[i] > str2[j]) return 1;
if (str1[i] < str2[j]) return -1;
i++;
j++;
}
// 所有位都相等
return 0;
}
string getIP()
{
WSADATA WSAData;
char hostName[256];
if (!WSAStartup(MAKEWORD(2, 0), &WSAData))
{
if (!gethostname(hostName, sizeof(hostName)))
{
hostent* host = gethostbyname(hostName);
if (host != NULL)
{
return inet_ntoa(*(struct in_addr*)*host->h_addr_list);
}
}
}
return "Get IP failed.";
}
// 判断字符串str是否以suffix结尾
int endsWith(const char* str, const char* suffix) {
size_t lenStr = strlen(str);
size_t lenSuffix = strlen(suffix);
// 如果suffix比str还要长肯定不匹配
if (lenSuffix > lenStr) return 0;
// 检查str的末尾是否与suffix完全一致
return strncmp(str + lenStr - lenSuffix, suffix, lenSuffix) == 0;
}
int JK_Send_SRM(EPM_action_message_t msg)
{
char* log_file = NULL;
printf("创建日志文件\n");
//char* TO_SRM = (char*)malloc(sizeof("TO_SRM"));
char tc_log_file_name[128] = "";
strcpy(tc_log_file_name, "TO_SRM");
CreateLogFile(tc_log_file_name, &log_file);
WriteLog("*******************************************************************************\n");
WriteLog("* JK_Send_SRM is starting *\n");
WriteLog("*******************************************************************************\n");
int ifail = ITK_ok, att_cnt = 0;
tag_t task_tag = NULLTAG, rootTask_tag = NULLTAG, * attachments = NULL;
string ip = getIP();
WriteLog("ip=================================================%s\n", getIP().c_str());
//获取首选项路径
char* prePath = NULL;
char* urlPath = NULL;
int c_sql_value_count = 0;
char** option_values;
ITKCALL(PREF_ask_char_value("JK8_To_SRM_Filepath", 0, &prePath));
ITKCALL(PREF_ask_char_values("JK8_To_SRM_Connet_DB_Info", &c_sql_value_count, &option_values));
if (strcmp(getIP().c_str(), "10.200.2.42") == 0) {
ITKCALL(PREF_ask_char_value("JK8_To_SRM_Filepath", 2, &urlPath));
}
else {
ITKCALL(PREF_ask_char_value("JK8_To_SRM_Filepath", 1, &urlPath));
}
WriteLog("获取首选项完成\n");
string errorMessage = "";
//获取当前触发的任务
task_tag = msg.task;
//获取根流程节点
ifail = EPM_ask_root_task(task_tag, &rootTask_tag);
//获取目标引用对象
ifail = EPM_ask_attachments(rootTask_tag, EPM_target_attachment, &att_cnt, &attachments);
WriteLog("流程目标个数:%d\n", att_cnt);
for (int i = 0; i < att_cnt; i++)
{
tag_t tagt = NULLTAG;
tagt = attachments[i];
char* itemId = NULL;
char* revision = NULL;
char* ChangeNo = NULL;
char* MaterialDesc = NULL;
char* EcrNo = NULL;
char* type = NULL;
ITKCALL(AOM_ask_value_string(tagt, "object_type", &type));
WriteLog("类型===%s\n", type);
if (strcmp(type, "JK8PartDraw_CADRevision") == 0) {
//获取当前时间
string newTime = "";
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;
newTime.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));
WriteLog("newTime===%s\n", newTime.c_str());
ITKCALL(AOM_ask_value_string(tagt, "item_id", &itemId));
WriteLog("itemId===%s\n", itemId);
printf("0000000000000000\n");
if (strstr(itemId, "DWG")) {
//获取图纸属性
// 获取图纸的文件路径
//创建id的文件夹
string tzFinalPath = "";
string bgFinalPath = "";
string tzPath = "";
string tzUrlPath = "";
string mdTz = "md ";
tzPath.append(prePath).append("/").append(itemId);
tzUrlPath.append(urlPath).append("/").append(itemId);
printf("tzPath===%s\n", tzPath.c_str());
//创建id的文件夹
//if (_access(tzPath.c_str(), 0) != 0) {//判断ID的文件夹否存在
//创建文件夹
system(mdTz.append("\"").append(tzPath).append("\"").c_str());
// }
//获取版本下的数据集
int dataset_num = 0;
tag_t* dataset_tags = NULL;
char* origin_file_name = NULL;
tag_t* ref_object = NULL;
int n_found = 0;
char* file_type = NULL;
ITKCALL(AOM_ask_value_tags(tagt, "IMAN_specification", &dataset_num, &dataset_tags));
for (int k = 0; k < dataset_num; k++) {
string exportName = "";
ITKCALL(AOM_ask_value_string(dataset_tags[k], "object_type", &file_type));
if (strstr(file_type, "JK8_AutoCAD")) {
ITKCALL(AE_ask_dataset_named_refs(dataset_tags[k], &n_found, &ref_object));
if (n_found > 0) {
int timeS = 0;
int timeF = 0;
tag_t ref_objectF = NULLTAG;
string origin_file_nameStr;
for (int x = 0; x < n_found; x++) {
ITKCALL(AOM_ask_value_string(ref_object[x], "original_file_name", &origin_file_name));
ITKCALL(AOM_ask_value_int(ref_object[x], "time_last_modified", &timeS));
printf("current_name========%s\n", origin_file_name);
printf("timeS========%d\n", timeS);
if (endsWith(origin_file_name, ".dwg")) {
printf("%s 结尾是 .dwg\n", origin_file_name);
if (timeF == 0) {
origin_file_nameStr = origin_file_name;
ref_objectF = ref_object[x];
timeF = timeS;
printf("timeF========%d\n", timeF);
}
else {
if (timeS > timeF) {
origin_file_nameStr = origin_file_name;
ref_objectF = ref_object[x];
timeF = timeS;
printf("timeF2========%d\n", timeF);
}
}
}
}
if (ref_objectF != NULLTAG) {
// 使用 remove() 函数删除文件
if (remove(exportName.append(tzPath).append("/").append(origin_file_nameStr).c_str()) == 0) {
printf("---------------D。\n");
}
else {
printf("FFFFFFFFFFFFFFFF");
}
ITKCALL(IMF_export_file(ref_objectF, exportName.c_str()));
printf("exportName========%s\n", exportName.c_str());
tzFinalPath.append(tzUrlPath).append("/").append(origin_file_nameStr).append(";");
}
}
}
}
DOFREE(origin_file_name);
DOFREE(file_type);
//获取版本
ITKCALL(AOM_ask_value_string(tagt, "item_revision_id", &revision));
std::string str(revision);
// 找到第一个非零字符的位置
size_t pos = str.find_first_not_of('0');
if (pos != std::string::npos) {
// 如果找到了非零字符,从该位置开始截取字符串
str = str.substr(pos);
}
else {
// 如果全是零,设置为空字符串
str.clear();
}
//versionStr.erase(versionStr.begin());
//变更单号
int bgdh_num = 0;
tag_t* bgdh_tags = NULL;
ITKCALL(AOM_ask_value_tags(tagt, "JK8CADRelation", &bgdh_num, &bgdh_tags));
if (bgdh_num > 0) {
ITKCALL(AOM_ask_value_string(bgdh_tags[0], "item_id", &EcrNo));
string bgPath = "";
string bgUrlPath = "";
string mdBg = "md ";
string mdBgBg = "md ";
bgPath.append(prePath).append("/").append(itemId);
bgUrlPath.append(urlPath).append("/").append(itemId);
//创建id的文件夹
//if (_access(bgPath.c_str(), 0) != 0) {//判断ID的文件夹否存在
//创建文件夹
system(mdBg.append("\"").append(bgPath).append("\"").c_str());
//}
bgPath.append("/").append("变更通知单");
bgUrlPath.append("/").append("变更通知单");
system(mdBgBg.append("\"").append(bgPath).append("\"").c_str());
//变更单文件路径
//获取版本下的数据集
int dataset_num = 0;
tag_t* dataset_tags = NULL;
char* origin_file_name = NULL;
tag_t* ref_object = NULL;
int n_found = 0;
char* file_type = NULL;
ITKCALL(AOM_ask_value_tags(bgdh_tags[0], "IMAN_specification", &dataset_num, &dataset_tags));
for (int k = 0; k < dataset_num; k++) {
string exportName = "";
ITKCALL(AOM_ask_value_string(dataset_tags[k], "object_type", &file_type));
printf("file_type===%s\n", file_type);
if (strstr(file_type, "MSWordX") || strstr(file_type, "MS WordX")) {
ITKCALL(AE_ask_dataset_named_refs(dataset_tags[k], &n_found, &ref_object));
if (n_found > 0) {
ITKCALL(AOM_ask_value_string(ref_object[0], "original_file_name", &origin_file_name));
printf("current_name========%s\n", origin_file_name);
// 使用 remove() 函数删除文件
if (remove(exportName.append(bgPath).append("/").append(origin_file_name).c_str()) == 0) {
printf("---------------D。\n");
}
else {
printf("FFFFFFFFFFFFFFFF");
}
ITKCALL(IMF_export_file(ref_object[0], exportName.c_str()));
printf("exportName========%s\n", exportName.c_str());
bgFinalPath.append(bgUrlPath).append("/").append(origin_file_name).append(";");
}
}
}
DOFREE(origin_file_name);
DOFREE(file_type);
}
//获取文件路径
//获取物料
char* wlItenId = "";
int material_num = 0;
tag_t* material_tags = NULL;
ITKCALL(AOM_ask_value_tags(tagt, "representation_for", &material_num, &material_tags));
WriteLog("representation_for下对象个数%d\n", material_num);
for (int j = 0; j < material_num; j++) {//一个物料一个数据
ITKCALL(AOM_ask_value_string(material_tags[j], "object_desc", &MaterialDesc));
ITKCALL(AOM_ask_value_string(material_tags[j], "item_id", &wlItenId));
string sql = "select * from CHINT_CHECK_TITLE_TEMPLATE where drawingno = '%s' ";
if (ConnServer(option_values[0], option_values[1], option_values[2]))//"tc11","infodba","//172.16.50.40/tc11" "TC12","infodba","172.16.68.13/tc1"
{
WriteLog("提示:中间数据表访问失败\n");
EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, "中间数据表访问失败!\n"); //错误弹窗
return ifail;
}
else {
string selectSql = "select * from TC_TO_SRM where MaterialCode = '%s' and ChangeNo = '%s' and DesignID = '%s'";
char selectRecord[400];
sprintf(selectRecord, selectSql.c_str(), wlItenId, str.c_str(), itemId);
printf("selectSql ===> %s\n", selectRecord);
int outputColumn = 0, outputValueCount = 0;
char*** outputValue = NULL;
QuerySQLNoInputParam(selectRecord, &outputColumn, &outputValueCount, &outputValue);
printf("outputValueCount===%d\n", outputValueCount);
if (outputValueCount > 0) {
char sql[1024] = "\0";
sprintf(sql, "update TC_TO_SRM set MaterialDesc = '%s',FilePath = '%s',EcrNo = '%s',EcrFile = '%s',SendTime = TO_DATE('%s', 'YYYY-MM-DD HH24:MI:SS') where MaterialCode = '%s' and ChangeNo = '%s' and DesignID = '%s'" , MaterialDesc, tzFinalPath.c_str(), EcrNo, bgFinalPath.c_str(), newTime.c_str(), wlItenId, str.c_str(), itemId);
WriteLog("提示:sql==%s\n", sql);
if (ExecuteSQLNoInputParam(sql) == -1)
{
WriteLog("提示:数据更新 失败, %s \n", sql);
EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, "数据库更新失败!\n"); //错误弹窗
return 0;
}
else {
ExecuteSQLNoInputParam("commit");
WriteLog("id:%s更新完成!\n", itemId);
}
}
else {
char sql[1024] = "\0";
sprintf(sql, "insert into TC_TO_SRM(MaterialCode,ChangeNo,MaterialDesc,DesignID,FilePath,EcrNo,EcrFile,SendTime) values('%s','%s','%s','%s','%s','%s','%s',TO_DATE('%s', 'YYYY-MM-DD HH24:MI:SS'))", wlItenId, str.c_str(), MaterialDesc, itemId, tzFinalPath.c_str(), EcrNo, bgFinalPath.c_str(), newTime.c_str());
WriteLog("提示:sql==%s\n", sql);
if (ExecuteSQLNoInputParam(sql) == -1)
{
WriteLog("提示:数据插入 失败, %s \n", sql);
EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, "数据库插入失败!\n"); //错误弹窗
return 0;
}
else {
ExecuteSQLNoInputParam("commit");
WriteLog("id:%s插入完成!\n",itemId);
}
}
}
}
DOFREE(wlItenId);
}
}
WriteLog("DOFREE start\n");
DOFREE(itemId);
DOFREE(revision);
DOFREE(ChangeNo);
DOFREE(MaterialDesc);
DOFREE(EcrNo);
DOFREE(type);
WriteLog("DOFREE end\n");
}
WriteLog("JK_Send_SRM正常退出1!\n");
WriteLog("*******************************************************************************\n");
WriteLog("* JK_Send_SRM is ending *\n");
WriteLog("*******************************************************************************\n");
CloseLog();
return 0;
}