#define _CRT_SECURE_NO_WARNINGS
#include "epm_handler_common.h"
#include "OracleDB.h"



map<string, int> getClassAttrMapRuleRelease(map<string, map<string, int>> classMap, char* classId) {
	map<string, int> attrMap;
	//分类属性名称对应id map存储
	if (classMap.find(classId) == classMap.end()) {
		int count = 0;
		int* ids;
		int* arraySize;
		int* formats;
		int* options;
		char** names;
		char** shortNames;
		char** annotations;
		char** unit;
		char** minValues;
		char** maxValues;
		char** defaultValues;
		char** descriptions;
		ITKCALL(ICS_class_describe_attributes(classId, &count, &ids, &names, &shortNames, &annotations, &arraySize,
			&formats, &unit, &minValues, &maxValues, &defaultValues, &descriptions, &options));
		for (int i = 0; i < count; i++)
		{
			attrMap.insert(pair<string, int>(names[i], ids[i]));
		}
		classMap.insert(pair<string, map<string, int>>(classId, attrMap));
		if (ids != NULL) {
			DOFREE(ids);
		}
		if (arraySize != NULL) {
			DOFREE(arraySize);
		}
		if (formats != NULL) {
			DOFREE(formats);
		}
		if (options != NULL) {
			DOFREE(options);
		}
		if (names != NULL) {
			DOFREE(names);
		}
		if (shortNames != NULL) {
			DOFREE(shortNames);
		}
		if (annotations != NULL) {
			DOFREE(annotations);
		}
		if (unit != NULL) {
			DOFREE(unit);
		}
		if (minValues != NULL) {
			DOFREE(minValues);
		}
		if (maxValues != NULL) {
			DOFREE(maxValues);
		}
		if (defaultValues != NULL) {
			DOFREE(defaultValues);
		}
		if (descriptions != NULL) {
			DOFREE(descriptions);
		}
	}
	else {
		attrMap = classMap[classId];
	}
	return attrMap;
}
void getItemClassRuleRelease(char** c_sql_values, char* itemType, tag_t ico_tag, tag_t zi_rev, map<string, int> attrMap, char* classId, char** classCode, string& errMsg, char* itemId1) {
	WriteLog("-----------------getItemClass------------------------\n");

	char* field1 = NULL;
	char* field2 = NULL;
	int outputColumn = 0, outputValueCount = 0;
	char*** outputValue = NULL;
	//物料分类特殊处理,通过数据库表匹配
	char sql[1024] = "\0";
	if (strcmp("RB3_LBJRevision", itemType) == 0 || strcmp("RB3_GNZCRevision", itemType) == 0 || strcmp("RB3_GNLBJRevision", itemType) == 0 || strcmp("RB3_GYZYRevision", itemType) == 0) {
		if (strcmp("RB3_LBJRevision", itemType) == 0 && ico_tag != NULLTAG)
		{
			ITKCALL(AOM_UIF_ask_value(zi_rev, "object_name", &field1));
			char* value = NULL;
			ICS_ask_attribute_value(ico_tag, "类别", &value);
			if (value != NULL) {
				int id = attrMap["类别"];
				getClassValue(value, id, &field2);
				DOFREE(value);
			}
		}
		else if (strcmp("RB3_GNZCRevision", itemType) == 0 && ico_tag != NULLTAG)
		{
			char* value = NULL;
			ICS_ask_attribute_value(ico_tag, "产品类别", &value);
			if (value != NULL) {
				int id = attrMap["产品类别"];
				getClassValue(value, id, &field1);
				DOFREE(value);
			}
			ITKCALL(AOM_UIF_ask_value(zi_rev, "object_name", &field2));
		}
		else if (strcmp("RB3_GNLBJRevision", itemType) == 0 && ico_tag != NULLTAG)
		{
			ITKCALL(AOM_UIF_ask_value(zi_rev, "object_name", &field1));
			char* value = NULL;
			ICS_ask_attribute_value(ico_tag, "产品类别", &value);
			if (value != NULL) {
				int id = attrMap["产品类别"];
				getClassValue(value, id, &field2);
				DOFREE(value);
			}
		}
		else if (strcmp("RB3_GYZYRevision", itemType) == 0 && ico_tag != NULLTAG)
		{
			char* new_classId = NULL;
			if (startsWith(classId, '1', '2') || startsWith(classId, '1', '7'))
			{
				new_classId = getFirstStr(classId, 2);
			}
			else
			{
				new_classId = getFirstStr(classId, 4);
			}
			tag_t classTag = NULLTAG;
			char* id = NULL;
			if (new_classId != NULL) {
				ITKCALL(ICS_find_class(new_classId, &classTag));
				if (classTag != NULLTAG)
				{
					ITKCALL(ICS_ask_id_name(classTag, &id, &field1));
				}
			}
			if (id != NULL) {
				DOFREE(id);
			}
			if (classTag != NULL) {
				DOFREE(classTag);
			}
			if (new_classId != NULL) {
				DOFREE(new_classId);
			}
		}

		if (field1 != NULL) {
			if (field1 != NULL && field2 != NULL) {
				sprintf(sql, "select PCLASSCODE,PCLASSNAME,NEW_COLUMN,PUNIT from PLM_ERP_CLASS_TABLE where PFIELD01= '%s' and PFIELD02= '%s'", field1, field2);
			}
			else {
				sprintf(sql, "select PCLASSCODE,PCLASSNAME,NEW_COLUMN,PUNIT from PLM_ERP_CLASS_TABLE where PFIELD01= '%s'", field1);
			}
		}
	}
	else {
		if (strcmp("RB3_ZCRevision", itemType) == 0)
		{
			ITKCALL(AOM_UIF_ask_value(zi_rev, "rb3_zclx", &field1));
		}
		else if (strcmp("RB3_BZJRevision", itemType) == 0 || strcmp("RB3_BZJBJRevision", itemType) == 0
			|| strcmp("RB3_YZRevision", itemType) == 0 || strcmp("RB3_GQRevision", itemType) == 0
			|| strcmp("RB3_GQBJRevision", itemType) == 0 || strcmp("RB3_GZRevision", itemType) == 0
			|| strcmp("RB3_GZBJRevision", itemType) == 0)
		{
			ITKCALL(AOM_UIF_ask_value(zi_rev, "object_name", &field1));
			WriteLog("提示:field1T==%s\n", field1);
		}
		else if (strcmp("RB3_YCLRevision", itemType) == 0 || strcmp("RB3_SLRevision", itemType) == 0
			|| strcmp("RB3_XJRevision", itemType) == 0 || strcmp("RB3_WJTLRevision", itemType) == 0)
		{
			ITKCALL(AOM_UIF_ask_value(zi_rev, "rb3_bjlx", &field1));
			
			//20251117
			if (strcmp("RB3_YCLRevision", itemType) == 0 && ico_tag != NULLTAG) {
				char* value = NULL;
				ICS_ask_attribute_value(ico_tag, "材料形状", &value);
				if (value != NULL) {
					int id = attrMap["材料形状"];
					getClassValue(value, id, &field2);
					DOFREE(value);
				}
			}
			

		}
		else if (strcmp("RB3_XZCPRevision", itemType) == 0)
		{
			ITKCALL(AOM_UIF_ask_value(zi_rev, "rb3_cplx2", &field1));
		}
		else if (strcmp("RB3_XZLBJRevision", itemType) == 0 && ico_tag != NULLTAG)
		{
			char* value = NULL;
			ICS_ask_attribute_value(ico_tag, "零件类别", &value);
			if (value != NULL) {
				int id = attrMap["零件类别"];
				getClassValue(value, id, &field1);
				DOFREE(value);
			}
		}


		if (field1 != NULL) {
			WriteLog("1field1=== %s \n", field1);
			if (field2 != NULL) {
				sprintf(sql, "select PCLASSCODE,PCLASSNAME,NEW_COLUMN,PUNIT from PLM_ERP_CLASS_TABLE where  PTYPE= '%s' and PFIELD01= '%s' and PFIELD02= '%s'", itemType, field1, field2);
			}
			else {
				sprintf(sql, "select PCLASSCODE,PCLASSNAME,NEW_COLUMN,PUNIT from PLM_ERP_CLASS_TABLE where PTYPE= '%s' and PFIELD01= '%s'", itemType, field1);
			}
		}
	}
	if (strcmp("", sql) != 0) {
		WriteLog("提示:sqlT==%s\n", sql);
		// 初始化 OCILIB 环境
		if (!OCI_Initialize(nullptr, nullptr, OCI_ENV_DEFAULT)) {
			std::cerr << "OCILIB 初始化失败" << std::endl;
		}
		OracleDB db;
		boolean status = db.connect(c_sql_values[1], c_sql_values[2], c_sql_values[0]);
		if (!status) { // 替换为实际的连接信息
			std::cerr << "数据库连接失败" << std::endl;
			OCI_Cleanup();
		}
		else {
			if (db.executeQuery(sql, &outputColumn, &outputValueCount, &outputValue) == -1 || outputValueCount == 0)
			{
				WriteLog("提示:物料分类查询 失败, %s \n", sql);
				if (field1 != NULL) {
					char sql2[128] = "\0";
					sprintf(sql2, "select PCLASSCODE,PCLASSNAME from PLM_ERP_CLASS_TABLE where PFIELD01= '%s'", field1);
					WriteLog("提示:sql2T==%s\n", sql2);
					if (db.executeQuery(sql2, &outputColumn, &outputValueCount, &outputValue) == -1)
					{
						WriteLog("提示:物料分类查询 失败, %s \n", sql2);
					}
				}

			}

		}
		db.disconnect();

		WriteLog("outputValueCount=%d\n", outputValueCount);
		WriteLog("outputColumn=%d\n", outputColumn);
		//free(sql);
		if (outputValueCount > 0) {
			*classCode = outputValue[0][0];
			WriteLog("物料分类====%s\n", *classCode);
		}
		else {

			errMsg.append(itemId1);
			errMsg.append("物料分类查询失败,请检查表PLM_ERP_FACTORY_TABLE");
			//EMH_store_error_s2(EMH_severity_error, 919031, errMsg.c_str(), "失败");
			if (outputValue != NULL) {
				DOFREE(outputValue);
			}
			if (field1 != NULL) {
				DOFREE(field1);
			}
			if (field2 != NULL) {
				DOFREE(field2);
			}
			return;

		}
	}
	if (outputValue != NULL) {
		DOFREE(outputValue);
	}
	if (field1 != NULL) {
		DOFREE(field1);
	}
	if (field2 != NULL) {
		DOFREE(field2);
	}


}


void getBomLinePropertyNewRuleRelease(tag_t topLine, char** c_sql_values, vector<string>* parameters_vec, map<string, map<string, int>> classMap, map<string, vector<string>> factoryMap, map<string, string> unitMap, string& errMsg, char* itemId1)
{
	WriteLog("开始获取子件信息\n");
	tag_t fu_rev = NULLTAG;
	AOM_ask_value_tag(topLine, "bl_line_object", &fu_rev);

	tag_t* children_line = NULLTAG;
	int  count = 0;

	BOM_line_ask_all_child_lines(topLine, &count, &children_line);
	if (count > 0) {

	
		char* fu_item_id = NULL;
		char* fu_smzqzt = NULL;
		char* fu_item_revision_id = NULL;
		char* fu_object_name = NULL;
		char* fu_object_type = NULL;
		char* fu_cph = NULL;
		char** fu_scgc = NULL;
		int factoryCount = 0;
		ITKCALL(AOM_UIF_ask_value(fu_rev, "item_id", &fu_item_id));
	
		ITKCALL(AOM_UIF_ask_value(fu_rev, "item_revision_id", &fu_item_revision_id));
		ITKCALL(AOM_UIF_ask_value(fu_rev, "object_name", &fu_object_name));
		ITKCALL(AOM_UIF_ask_value(fu_rev, "rb3_cph", &fu_cph));
		char* itemType = NULL;
		AOM_ask_value_string(fu_rev, "object_type", &itemType);

		if (strcmp("RB3_GNLBJRevision", itemType) == 0) {
			ITKCALL(AOM_UIF_ask_value(fu_rev, "rb3_smzqtz", &fu_smzqzt));
		}
		else {
			ITKCALL(AOM_UIF_ask_value(fu_rev, "rb3_smzqzt", &fu_smzqzt));
		}



		if (strcmp("RB3_XZCPRevision", itemType) == 0 || strcmp("RB3_XZLBJRevision", itemType) == 0) {
			ITKCALL(AOM_ask_value_strings(fu_rev, "rb3_xzscgc", &factoryCount, &fu_scgc));
		
		}
		else if (strcmp("RB3_GNZCRevision", itemType) == 0 || strcmp("RB3_GNLBJRevision", itemType) == 0
			|| strcmp("RB3_GYZYRevision", itemType) == 0 || strcmp("RB3_BZJRevision", itemType) == 0) {
			ITKCALL(AOM_ask_value_strings(fu_rev, "rb3_scgc", &factoryCount, &fu_scgc));

		}
		else if (strcmp("RB3_YCLRevision", itemType) == 0 || strcmp("RB3_XJRevision", itemType) == 0 || strcmp("RB3_WJTLRevision", itemType) == 0 || strcmp("RB3_SLRevision", itemType) == 0) {
			ITKCALL(AOM_ask_value_strings(fu_rev, "rb3_sygc1", &factoryCount, &fu_scgc));
		
		}
		else {
			ITKCALL(AOM_ask_value_strings(fu_rev, "rb3_scgc1", &factoryCount, &fu_scgc));

		}
		ITKCALL(AOM_ask_value_string(fu_rev, "object_type", &fu_object_type));

	

		WriteLog("111\n");
		char facttoryNameStr[10000] = "\0";
		char factoryCodeStr[10000] = "\0";
		char organizeNameStr[15000] = "\0";
		char organizeCodeStr[15000] = "\0";
		WriteLog("222\n");
		//这里写服务名,不能用实例名(名称相同除外)
			//工厂组织编码特殊处理,通过数据库表匹配

		for (int i = 0; i < factoryCount; i++)
		{
			if (factoryMap.find(fu_scgc[i]) == factoryMap.end()) {

				
					WriteLog("提示:fu_scgc[i]==%s\n", fu_scgc[i]);
		

				char* factoryCode = NULL;
				char* factoryName = NULL;
				int factoryColumn = 0, factoryValueCount = 0;
				char*** factoryValue = NULL;
				char factorySql[128] = "\0";


				if (fu_scgc[i] == NULL || strcmp(fu_scgc[i], "") == 0 || strcmp(fu_scgc[i], "0") == 0) {
					sprintf(factorySql, "select PFACTORYCODE,PFACTORYNAME from PLM_ERP_FACTORY_TABLE where PFACTORY= 'globa100'");

				}
				else {
					sprintf(factorySql, "select PFACTORYCODE,PFACTORYNAME from PLM_ERP_FACTORY_TABLE where PFACTORYEN= '%s'", fu_scgc[i]);

				}
				if (!OCI_Initialize(nullptr, nullptr, OCI_ENV_DEFAULT)) {
					std::cerr << "OCILIB 初始化失败" << std::endl;
				}
				OracleDB db;
				boolean status = db.connect(c_sql_values[1], c_sql_values[2], c_sql_values[0]);
				if (!status) { // 替换为实际的连接信息
					std::cerr << "数据库连接失败" << std::endl;
					OCI_Cleanup();
				}
				else {
					if (db.executeQuery(factorySql, &factoryColumn, &factoryValueCount, &factoryValue) == -1)
					{
						WriteLog("提示:组织编码查询 失败, %s \n", factorySql);
					}

				}



				db.disconnect();
				WriteLog("提示:factorySql==%s\n", factorySql);

				WriteLog("factoryValueCount=%d\n", factoryValueCount);
				WriteLog("factoryColumn=%d\n", factoryColumn);
				if (factoryValueCount > 0) {
					factoryCode = factoryValue[0][0];
					factoryName = factoryValue[0][1];
					vector<string> factoryVec;
					factoryVec.push_back(factoryCode);
					factoryVec.push_back(factoryName);
					factoryMap[fu_scgc[i]] = factoryVec;
					//WriteLog("组织编码====%s\n", factoryCode);
					//WriteLog("组织名称====%s\n", factoryName);
					if (strcmp(facttoryNameStr, "") != 0) {
						strcat(facttoryNameStr, ",");
						strcat(factoryCodeStr, ",");
					}
					if (factoryName != NULL) {
						strcat(facttoryNameStr, factoryName);
					}
					if (factoryCode != NULL) {
						strcat(factoryCodeStr, factoryCode);
					}

				}
				else {


					errMsg.append(itemId1);
					errMsg.append("组织编码查询失败,请检查表PLM_ERP_FACTORY_TABLE");
					//EMH_store_error_s2(EMH_severity_error, 919031, errMsg.c_str(), "失败");

					if (factoryValue != NULL) {
						for (int o = 0; o < factoryValueCount; ++o)
						{
							for (int k = 0; k < factoryValueCount; ++k) {
								delete[] factoryValue[o][k]; // 释放每个字符串
							}
							delete[] factoryValue[o]; // 释放内层指针数组

						}
						// 释放中间层的指针数组
						delete[] factoryValue; // 释放最外层指针数组

						// 将指针置空，避免悬挂指针
						factoryValue = nullptr;
					}


					if (factoryCode != NULL) {
						DOFREE(factoryCode);
					}
					if (factoryName != NULL) {
						DOFREE(factoryName);
					}
					return;

				}

				if (factoryValue != NULL) {
					for (int o = 0; o < factoryValueCount; ++o)
					{
						for (int k = 0; k < factoryValueCount; ++k) {
							delete[] factoryValue[o][k]; // 释放每个字符串
						}
						delete[] factoryValue[o]; // 释放内层指针数组

					}
					// 释放中间层的指针数组
					delete[] factoryValue; // 释放最外层指针数组

					// 将指针置空，避免悬挂指针
					factoryValue = nullptr;
				}
				if (factoryCode != NULL) {
					DOFREE(factoryCode);
				}
				if (factoryName != NULL) {
					DOFREE(factoryName);
				}
			}
			else {
				vector<string> factoryVec = factoryMap[fu_scgc[i]];
				if (strcmp(facttoryNameStr, "") != 0) {
					strcat(facttoryNameStr, ",");
					strcat(factoryCodeStr, ",");
				}
				strcat(factoryCodeStr, factoryVec[0].c_str());
				strcat(facttoryNameStr, factoryVec[1].c_str());

			}

		}
		char* fu_class_code = NULL;
		tag_t fu_ico_tag = NULLTAG;
		char* fu_class_id = NULL;
		map<string, int> fuAttrMap;
		ICS_ask_classification_object(fu_rev, &fu_ico_tag);
		if (fu_ico_tag != NULLTAG) {
			ICS_ico_ask_class(fu_ico_tag, &fu_class_id);
			WriteLog(">> fu_class_id: %s\n", fu_class_id);
			fuAttrMap = getClassAttrMapRuleRelease(classMap, fu_class_id);
		}
		getItemClassRuleRelease(c_sql_values, fu_object_type, fu_ico_tag, fu_rev, fuAttrMap, fu_class_id, &fu_class_code, errMsg, itemId1);

		if (errMsg.size() > 0) {
			//EMH_store_error_s2(EMH_severity_error, 919031, errMsg.c_str(), "失败");


			if (fu_class_code != NULL) {
				DOFREE(fu_class_code);
			}
			if (fu_class_id != NULL) {
				DOFREE(fu_class_id);
			}
			return;
		}


		//处理组织工厂逻辑
		char* organizeCode = NULL;
		char* organizeName = NULL;
		char* organizeFactory = NULL;
		char factorySql2[128] = "\0";
		int organizeColumn = 0, organizeValueCount = 0;
		char*** organizeValue = NULL;
		WriteLog("fu_object_type: %s\n", fu_object_type);
		WriteLog("fu_class_code: %s\n", fu_class_code);
		WriteLog("fu_item_id: %s\n", fu_item_id);
		if (strcmp("RB3_LBJRevision", fu_object_type) == 0) {
			sprintf(factorySql2, "select PFACTORY,PFACTORYCODE,PFACTORYNAME from PLM_FACTORY_ORGANIZE_TABLE where CLASSCODE= '%s'", fu_class_code);
			WriteLog("提示:factorySql2==%s\n", factorySql2);

			if (!OCI_Initialize(nullptr, nullptr, OCI_ENV_DEFAULT)) {
				std::cerr << "OCILIB 初始化失败" << std::endl;
			}
			OracleDB db;
			boolean status = db.connect(c_sql_values[1], c_sql_values[2], c_sql_values[0]);
			if (!status) { // 替换为实际的连接信息
				std::cerr << "数据库连接失败" << std::endl;
				OCI_Cleanup();
			}
			else {


				if (db.executeQuery(factorySql2, &organizeColumn, &organizeValueCount, &organizeValue) == -1)
				{
					WriteLog("提示:组织编码查询 失败, %s \n", factorySql2);
				}
			}



			db.disconnect();

			//WriteLog("factoryValueCount=%d\n", organizeValueCount);
			//WriteLog("factoryColumn=%d\n", organizeColumn);
			if (organizeValueCount > 0) {
				organizeFactory = organizeValue[0][0];
				organizeCode = organizeValue[0][1];
				organizeName = organizeValue[0][2];
				WriteLog("组织工厂====%s\n", organizeFactory);
				WriteLog("组织名称2====%s\n", organizeName);
				WriteLog("组织编码2====%s\n", organizeCode);
			}
			else {
				strcpy(organizeNameStr, facttoryNameStr);
				strcpy(organizeCodeStr, factoryCodeStr);

			}
			if (organizeFactory != NULL && strcmp("", organizeFactory) != 0 && strcmp("NULL", organizeFactory) != 0) {
				strcpy(organizeNameStr, facttoryNameStr);
				strcpy(organizeCodeStr, factoryCodeStr);
			}
			if (organizeName != NULL && strcmp("NULL", organizeName) != 0 && strcmp("", organizeName) != 0) {
				if (strcmp(organizeNameStr, "") != 0) {
					strcat(organizeNameStr, ",");
				}
				strcat(organizeNameStr, organizeName);
			}
			if (organizeCode != NULL && strcmp("NULL", organizeCode) != 0 && strcmp("", organizeCode) != 0) {
				if (strcmp(organizeCodeStr, "") != 0) {
					strcat(organizeCodeStr, ",");
				}
				strcat(organizeCodeStr, organizeCode);
			}
		}
		else if (strcmp("RB3_XZCPRevision", fu_object_type) == 0) {
			char* field1 = NULL;
			int outputColumn = 0, outputValueCount = 0;
			char*** outputValue = NULL;
			//物料分类特殊处理,通过数据库表匹配
			char sql[1024] = "\0";
			ITKCALL(AOM_UIF_ask_value(fu_rev, "rb3_cplx2", &field1));
			if (field1 != NULL) {
				sprintf(sql, "select PCLASSCODE from PLM_ERP_CLASS_TABLE where PFIELD01= '%s'", field1);
			}
			if (!OCI_Initialize(nullptr, nullptr, OCI_ENV_DEFAULT)) {
				std::cerr << "OCILIB 初始化失败" << std::endl;
			}
			OracleDB db;
			boolean status = db.connect(c_sql_values[1], c_sql_values[2], c_sql_values[0]);
			if (!status) { // 替换为实际的连接信息
				std::cerr << "数据库连接失败" << std::endl;
				OCI_Cleanup();
			}
			else {

				if (db.executeQuery(sql, &outputColumn, &outputValueCount, &outputValue) == -1 || outputValueCount == 0)
				{
					WriteLog("提示:父级物料分类查询 失败, %s \n", sql);
					strcpy(organizeNameStr, facttoryNameStr);
					strcpy(organizeCodeStr, factoryCodeStr);
				}
				else {
					//WriteLog("outputValueCount=%d\n", outputValueCount);
					//WriteLog("outputColumn=%d\n", outputColumn);
					//free(sql);
					char* fuClassCode = NULL;
					if (outputValueCount > 0) {
						fuClassCode = outputValue[0][0];
						//WriteLog("父级物料分类====%s\n", fuClassCode);
					}
					if (strcmp("IN07", fuClassCode) == 0) {
						sprintf(factorySql2, "select PFACTORYCODE,PFACTORYNAME from PLM_FACTORY_ORGANIZE_TABLE where PTYPE= 'RB3_GNZCRevision' and PFIELD01= '滚动体类'");
						WriteLog("提示:factorySql2==%s\n", factorySql2);
						if (db.executeQuery(factorySql2, &organizeColumn, &organizeValueCount, &organizeValue) == -1)
						{
							WriteLog("提示:组织编码查询 失败, %s \n", factoryCodeStr);
						}
						//WriteLog("factoryValueCount=%d\n", organizeValueCount);
						//WriteLog("factoryColumn=%d\n", organizeColumn);
						if (organizeValueCount > 0) {
							organizeCode = organizeValue[0][0];
							organizeName = organizeValue[0][1];
							WriteLog("组织名称2====%s\n", organizeName);
							WriteLog("组织编码2====%s\n", organizeCode);
						}
						else {
							strcpy(organizeNameStr, facttoryNameStr);
							strcpy(organizeCodeStr, factoryCodeStr);

						}
						if (organizeName != NULL && strcmp("NULL", organizeName) != 0) {
							strcpy(organizeNameStr, organizeName);
						}
						if (organizeCode != NULL && strcmp("NULL", organizeCode) != 0) {
							strcpy(organizeCodeStr, organizeCode);
						}
					}
					else {
						strcpy(organizeNameStr, facttoryNameStr);
						strcpy(organizeCodeStr, factoryCodeStr);
					}
					if (fuClassCode != NULL) {
						DOFREE(fuClassCode);
					}
				}
			}



			db.disconnect();



			if (field1 != NULL) {
				DOFREE(field1);
			}
			if (outputValue != NULL) {
				DOFREE(outputValue);
			}
		}
		else if (strcmp("RB3_BZJRevision", fu_object_type) == 0) {
			char* field1 = NULL;
			int outputColumn = 0, outputValueCount = 0;
			char*** outputValue = NULL;
			//物料分类特殊处理,通过数据库表匹配
			char sql[1024] = "\0";
			ITKCALL(AOM_UIF_ask_value(fu_rev, "object_name", &field1));
			if (field1 != NULL) {
				sprintf(sql, "select PCLASSCODE from PLM_ERP_CLASS_TABLE where PFIELD01= '%s'", field1);
			}
			if (!OCI_Initialize(nullptr, nullptr, OCI_ENV_DEFAULT)) {
				std::cerr << "OCILIB 初始化失败" << std::endl;
			}
			OracleDB db;
			boolean status = db.connect(c_sql_values[1], c_sql_values[2], c_sql_values[0]);
			if (!status) { // 替换为实际的连接信息
				std::cerr << "数据库连接失败" << std::endl;
				OCI_Cleanup();
			}
			else {
				if (db.executeQuery(sql, &outputColumn, &outputValueCount, &outputValue) == -1 || outputValueCount == 0)
				{
					WriteLog("提示:父级物料分类查询 失败, %s \n", sql);
					strcpy(organizeNameStr, facttoryNameStr);
					strcpy(organizeCodeStr, factoryCodeStr);
				}
				else {
					//WriteLog("outputValueCount=%d\n", outputValueCount);
					//WriteLog("outputColumn=%d\n", outputColumn);
					//free(sql);
					char* fuClassCode = NULL;
					if (outputValueCount > 0) {
						fuClassCode = outputValue[0][0];
						//WriteLog("父级物料分类====%s\n", fuClassCode);
					}
					if (strcmp("IN07", fuClassCode) == 0) {
						sprintf(factorySql2, "select PFACTORY,PFACTORYCODE,PFACTORYNAME from PLM_FACTORY_ORGANIZE_TABLE where CLASSCODE= '%s'", fuClassCode);
						WriteLog("提示:factorySql2==%s\n", factorySql2);


						if (db.executeQuery(factorySql2, &organizeColumn, &organizeValueCount, &organizeValue) == -1)
						{
							WriteLog("提示:组织编码查询 失败, %s \n", factoryCodeStr);
						}


						//WriteLog("factoryValueCount=%d\n", organizeValueCount);
						//WriteLog("factoryColumn=%d\n", organizeColumn);
						if (organizeValueCount > 0) {
							organizeFactory = organizeValue[0][0];
							organizeCode = organizeValue[0][1];
							organizeName = organizeValue[0][2];
							WriteLog("组织工厂====%s\n", organizeFactory);
							WriteLog("组织名称2====%s\n", organizeName);
							WriteLog("组织编码2====%s\n", organizeCode);
						}
						else {
							strcpy(organizeNameStr, facttoryNameStr);
							strcpy(organizeCodeStr, factoryCodeStr);

						}
						if (organizeFactory != NULL && strcmp("", organizeFactory) != 0 && strcmp("NULL", organizeFactory) != 0) {
							strcpy(organizeNameStr, facttoryNameStr);
							strcpy(organizeCodeStr, factoryCodeStr);
						}
						if (organizeName != NULL && strcmp("NULL", organizeName) != 0 && strcmp("", organizeName) != 0) {
							if (strcmp(organizeNameStr, "") != 0) {
								strcat(organizeNameStr, ",");
							}
							strcat(organizeNameStr, organizeName);
						}
						if (organizeCode != NULL && strcmp("NULL", organizeCode) != 0 && strcmp("", organizeCode) != 0) {
							if (strcmp(organizeCodeStr, "") != 0) {
								strcat(organizeCodeStr, ",");
							}
							strcat(organizeCodeStr, organizeCode);
						}
					}
					else {
						strcpy(organizeNameStr, facttoryNameStr);
						strcpy(organizeCodeStr, factoryCodeStr);
					}
					if (fuClassCode != NULL) {
						DOFREE(fuClassCode);
					}
				}

			}



			db.disconnect();
			if (field1 != NULL) {
				DOFREE(field1);
			}
			if (outputValue != NULL) {
				DOFREE(outputValue);
			}
		}
		else {
			strcpy(organizeNameStr, facttoryNameStr);
			strcpy(organizeCodeStr, factoryCodeStr);

		}

		if (organizeCode != NULL) {
			DOFREE(organizeCode);
		}
		if (organizeName != NULL) {
			DOFREE(organizeName);
		}
		if (organizeFactory != NULL) {
			DOFREE(organizeFactory);
		}
		if (organizeValue != NULL) {
			for (int o = 0; o < organizeValueCount; ++o)
			{
				for (int k = 0; k < organizeValueCount; ++k) {
					delete[] organizeValue[o][k]; // 释放每个字符串
				}
				delete[] organizeValue[o]; // 释放内层指针数组

			}
			// 释放中间层的指针数组
			delete[] organizeValue; // 释放最外层指针数组

			// 将指针置空，避免悬挂指针
			organizeValue = nullptr;
		}
		if (fu_class_code != NULL) {
			DOFREE(fu_class_code);
		}
		if (fu_class_id != NULL) {
			DOFREE(fu_class_id);
		}
		DOFREE(facttoryNameStr);
		DOFREE(factoryCodeStr);

		WriteLog("count:%d\n", count);
		// 初始化变量和预估最大长度
		size_t buffer_size = 150000; // 初始大小，可根据实际情况调整
		char* parameters = static_cast<char*>(malloc(buffer_size));

		parameters[0] = '\0'; // 确保字符串以空字符开始
		strcat(parameters, "{");

		//AOM_ask_value_string(children_line[i], "fnd0bl_line_object_type", &itemType);
		strcat(parameters, "\"parentPartCode\":\"");
		strcat(parameters, fu_item_id == NULL ? "" : fu_item_id);
		strcat(parameters, "\",");
		strcat(parameters, "\"lifeCycleStages\":\"");
		strcat(parameters, fu_smzqzt == NULL ? "" : fu_smzqzt);
		strcat(parameters, "\",");
		strcat(parameters, "\"version\":\"");
		strcat(parameters, fu_item_revision_id == NULL ? "" : fu_item_revision_id);
		strcat(parameters, "\",");
		strcat(parameters, "\"componentType\":\"");
		strcat(parameters, fu_object_name == NULL ? "" : fu_object_name);
		strcat(parameters, "\",");
		strcat(parameters, "\"bomProductNumber1\":\"");
		strcat(parameters, fu_cph == NULL ? "" : fu_cph);
		strcat(parameters, "\",");
		strcat(parameters, "\"usingOrgName\":\"");
		strcat(parameters, organizeNameStr == NULL ? "" : organizeNameStr);
		strcat(parameters, "\",");
		strcat(parameters, "\"usingOrgCode\":\"");
		strcat(parameters, organizeCodeStr == NULL ? "" : organizeCodeStr);
		strcat(parameters, "\",");
		strcat(parameters, "\"bomDetail\":[");


		DOFREE(organizeNameStr);
		DOFREE(organizeCodeStr);

		for (int i = 0; i < count; i++)
		{
			tag_t zi_rev = NULLTAG;
			AOM_ask_value_tag(children_line[i], "bl_line_object", &zi_rev);
			tag_t ico_tag = NULLTAG;
			char* classId = NULL;
			map<string, int> attrMap;
			ICS_ask_classification_object(zi_rev, &ico_tag);
			if (ico_tag != NULLTAG) {
				ICS_ico_ask_class(ico_tag, &classId);
				WriteLog(">> classId: %s\n", classId);
				attrMap = getClassAttrMapRuleRelease(classMap, classId);
			}
			char* itemType = NULL;
			char* uiduid = NULL;
			ITK__convert_tag_to_uid(zi_rev, &uiduid);
			WriteLog("uiduid: %s\n", uiduid);
			AOM_ask_value_string(zi_rev, "object_type", &itemType);
			WriteLog("object_type: %s\n", itemType);
			char* zi_item_id = NULL;
			char* zi_smzqzt = NULL;
			char* zi_item_revision_id = NULL;
			char* zi_object_name = NULL;
			char* zi_cph = NULL;
			ITKCALL(AOM_UIF_ask_value(zi_rev, "item_id", &zi_item_id));



			if (strcmp("RB3_GNLBJRevision", itemType) == 0) {
				ITKCALL(AOM_UIF_ask_value(zi_rev, "rb3_smzqtz", &fu_smzqzt));
			}
			else {
				ITKCALL(AOM_UIF_ask_value(zi_rev, "rb3_smzqzt", &zi_smzqzt));
			}





			ITKCALL(AOM_UIF_ask_value(zi_rev, "item_revision_id", &zi_item_revision_id));
			ITKCALL(AOM_UIF_ask_value(zi_rev, "object_name", &zi_object_name));
			ITKCALL(AOM_UIF_ask_value(zi_rev, "rb3_cph", &zi_cph));
			char* zi_uom = NULL;
			char* zi_quantity = NULL;
			ITKCALL(AOM_UIF_ask_value(children_line[i], "bl_uom", &zi_uom));
			ITKCALL(AOM_UIF_ask_value(children_line[i], "bl_quantity", &zi_quantity));
			strcat(parameters, "{");
			strcat(parameters, "\"componentCode\":\"");
			strcat(parameters, zi_item_id == NULL ? "" : zi_item_id);
			strcat(parameters, "\",");
			strcat(parameters, "\"theLifecycle\":\"");
			strcat(parameters, zi_smzqzt == NULL ? "" : zi_smzqzt);
			strcat(parameters, "\",");
			strcat(parameters, "\"bomObjectVersion\":\"");
			strcat(parameters, zi_item_revision_id == NULL ? "" : zi_item_revision_id);
			strcat(parameters, "\",");
			strcat(parameters, "\"bomObjectType\":\"");
			strcat(parameters, zi_object_name == NULL ? "" : zi_object_name);
			strcat(parameters, "\",");
			strcat(parameters, "\"bomProductNumber\":\"");
			strcat(parameters, zi_cph == NULL ? "" : zi_cph);
			strcat(parameters, "\",");
			strcat(parameters, "\"bomQuantity\":");
			strcat(parameters, zi_quantity == NULL ? "" : zi_quantity);
			strcat(parameters, ",");
			char* classCode = NULL;
			getItemClassRuleRelease(c_sql_values, itemType, ico_tag, zi_rev, attrMap, classId, &classCode, errMsg, itemId1);


			if (errMsg.size() > 0) {
				//EMH_store_error_s2(EMH_severity_error, 919031, errMsg.c_str(), "失败");
				if (zi_item_id != NULL)
				{
					DOFREE(fu_item_id);
				}
				if (zi_smzqzt != NULL)
				{
					DOFREE(fu_smzqzt);
				}
				if (zi_item_revision_id != NULL)
				{
					DOFREE(fu_item_revision_id);
				}
				if (zi_object_name != NULL)
				{
					DOFREE(fu_object_name);
				}
				if (zi_cph != NULL)
				{
					DOFREE(fu_cph);
				}
				if (zi_uom != NULL)
				{
					DOFREE(zi_uom);
				}
				if (zi_quantity != NULL)
				{
					DOFREE(zi_quantity);
				}
				if (classCode != NULL)
				{
					DOFREE(classCode);
				}
				if (itemType != NULL) {
					DOFREE(itemType);
				}
				if (fu_item_id != NULL)
				{
					DOFREE(fu_item_id);
				}
				if (fu_smzqzt != NULL)
				{
					DOFREE(fu_smzqzt);
				}
				if (fu_item_revision_id != NULL)
				{
					DOFREE(fu_item_revision_id);
				}
				if (fu_object_name != NULL)
				{
					DOFREE(fu_object_name);
				}
				if (fu_cph != NULL)
				{
					DOFREE(fu_cph);
				}
				if (fu_scgc != NULL)
				{
					DOFREE(fu_scgc);
				}
				if (fu_object_type != NULL)
				{
					DOFREE(fu_object_type);
				}
				return;
			}

			//处理子件单位转换逻辑			
			if (strstr(zi_uom, "比例系数") != NULL) {
				strcat(parameters, "\"parentItemBase\":1,");
			}
			else {
				WriteLog("zi_uom111 = %s \n", zi_uom);
				WriteLog("classCode111 = %s \n", classCode);
				if (classCode != NULL) {
					if (strcmp("IN07", classCode) == 0 && strstr("L(粒)", zi_uom) != NULL)
					{
						zi_uom = "WL(万粒)";
						strcat(parameters, "\"parentItemBase\":10000,");
					}
					else if ((strcmp("IN01", classCode) == 0 || strcmp("IN56", classCode) == 0 || strcmp("IN59", classCode) == 0) && strstr("GM(克)", zi_uom) != NULL)
					{
						zi_uom = "T(吨)";
						strcat(parameters, "\"parentItemBase\":1000000,");
					}
					else if (strcmp("IN12", classCode) == 0 && strstr("GM(克)", zi_uom) != NULL)
					{
						zi_uom = "KG(千克)";
						strcat(parameters, "\"parentItemBase\":1000,");
					}
					else {
						strcat(parameters, "\"parentItemBase\":1,");
					}
				}
				else {
					strcat(parameters, "\"parentItemBase\":1,");
				}
			}
			strcat(parameters, "\"bomUnit\":\"");
			if (unitMap.find(zi_uom) != unitMap.end()) {
				strcat(parameters, unitMap[zi_uom].c_str());
			}
			else {
				strcat(parameters, zi_uom);
			}
			strcat(parameters, "\"");
			strcat(parameters, "}");
			//WriteLog("parameters%d:%s\n", i,parameters);
			if (i < count - 1) {
				strcat(parameters, ",");
			}
			if (zi_item_id != NULL)
			{
				DOFREE(fu_item_id);
			}
			if (zi_smzqzt != NULL)
			{
				DOFREE(fu_smzqzt);
			}
			if (zi_item_revision_id != NULL)
			{
				DOFREE(fu_item_revision_id);
			}
			if (zi_object_name != NULL)
			{
				DOFREE(fu_object_name);
			}
			if (zi_cph != NULL)
			{
				DOFREE(fu_cph);
			}
			if (zi_uom != NULL)
			{
				DOFREE(zi_uom);
			}
			if (zi_quantity != NULL)
			{
				DOFREE(zi_quantity);
			}
			if (classCode != NULL)
			{
				DOFREE(classCode);
			}
			if (itemType != NULL) {
				DOFREE(itemType);
			}
		}
		if (fu_item_id != NULL)
		{
			DOFREE(fu_item_id);
		}
		if (fu_smzqzt != NULL)
		{
			DOFREE(fu_smzqzt);
		}
		if (fu_item_revision_id != NULL)
		{
			DOFREE(fu_item_revision_id);
		}
		if (fu_object_name != NULL)
		{
			DOFREE(fu_object_name);
		}
		if (fu_cph != NULL)
		{
			DOFREE(fu_cph);
		}
		if (fu_scgc != NULL)
		{
			DOFREE(fu_scgc);
		}
		if (fu_object_type != NULL)
		{
			DOFREE(fu_object_type);
		}

		strcat(parameters, "]}");
		parameters_vec->push_back(parameters);
		free(parameters);
	}
	for (int i = 0; i < count; i++)
	{
		int child_count = 0;
		tag_t* zi_children_line = NULLTAG;
		BOM_line_ask_all_child_lines(children_line[i], &child_count, &zi_children_line);
		if (child_count > 0) {
			getBomLinePropertyNewRuleRelease(children_line[i], c_sql_values, parameters_vec, classMap, factoryMap, unitMap, errMsg, itemId1);
		}
	}
	if (children_line != NULL)
	{
		DOFREE(children_line);
	}

}



int RB_SendErpBom_New_Rule_Release(EPM_rule_message_t msg)
{


	char* log_file = NULL;
	WriteLog("创建日志文件\n");
	//char* TO_SRM = (char*)malloc(sizeof("TO_SRM"));
	char tc_log_file_name[200] = "";
	strcpy(tc_log_file_name, "RB_SendErpBom_New_Rule_Release");
	CreateLogFile(tc_log_file_name, &log_file);

	WriteLog("=========================BOM下发到ERP rule  Start===================\n");
	string errMsg = "";

	//POM_AM__set_application_bypass(true);
	int ifail = EPM_go;
	int  attachments_num = 0;
	tag_t  rootTask = NULLTAG, * attachments = NULLTAG;
	//获取任务对象
	EPM_ask_root_task(msg.task, &rootTask);
	//获取任务目标对象
	EPM_ask_attachments(rootTask, EPM_target_attachment, &attachments_num, &attachments);


	char* job_name = NULL;
	ITKCALL(AOM_ask_value_string(rootTask, "job_name", &job_name));
	WriteLog("流程名称：%s\n", job_name);
	int email_count = 0;
	char** email_values;
	ITKCALL(PREF_ask_char_values("RB_SEND_ERP_EMAIL", &email_count, &email_values));

	vector<string> mail_addrs;

	if (email_count > 0) {

		int valueCount = 0;
		char** valueChar = new char* [128];
		//分割字符串
		split(email_values[0], ";", valueChar, &valueCount);
		for (int i = 0; i < valueCount; i++) {
			mail_addrs.push_back(valueChar[i]);
		}
	}

	int user_cnt = mail_addrs.size();
	WriteLog("user_cnt===%d\n", user_cnt);

	int c_sql_value_count = 0;
	char** c_sql_values;
	ITKCALL(PREF_ask_char_values("RB3_SQL_Connect2", &c_sql_value_count, &c_sql_values));
	if (c_sql_value_count != 3)
	{
		WriteLog("首选项 RB3_SQL_Connect2 配置错误 数量%d  ", c_sql_value_count);
		CloseLog();
		return EPM_nogo;
	}
	int unit_pref_cnt = 0;
	char** unit_pref_vals = NULL;
	//获取首选项的值
	PREF_ask_char_values("RB_SEND_UNIT_MATCHING", &unit_pref_cnt, &unit_pref_vals);
	map<string, string> unitMap;
	for (int i = 0; i < unit_pref_cnt; i++)
	{
		if (strstr(unit_pref_vals[i], "=") != NULL)
		{
			//按照-进行拆分。拆分条件
			int valueCount = 0;
			char** valueChar = new char* [64];
			//分割字符串
			split(unit_pref_vals[i], "=", valueChar, &valueCount);
			unitMap[valueChar[0]] = valueChar[1];
			DOFREE(valueChar);
		}
	}
	char* tc_root_file = getenv("tc_root");		//C:\Siemens\Teamcenter11

	char errorMessage[100000] = "";//写入到文件的值
	for (int i = 0; i < attachments_num; i++)
	{
		char* itemType = NULL;
		POM_AM__set_application_bypass(true);
		AOM_ask_value_string(attachments[i], "object_type", &itemType);
		POM_AM__set_application_bypass(false);
		WriteLog("itemType：%s\n", itemType);

		//过滤掉非版本的对象
		//20250721 增加传递类型
		if (strcmp(itemType, "RB3_BZJBJRevision") == 0 || strcmp(itemType, "RB3_BZJRevision") == 0 || strcmp(itemType, "RB3_GNLBJRevision") == 0 || strcmp(itemType, "RB3_GNZCRevision") == 0 || strcmp(itemType, "RB3_GQBJRevision") == 0 || strcmp(itemType, "RB3_GQRevision") == 0 || strcmp(itemType, "RB3_GZBJRevision") == 0 || strcmp(itemType, "RB3_GZRevision") == 0 || strcmp(itemType, "RB3_LBJRevision") == 0 || strcmp(itemType, "RB3_SLRevision") == 0 || strcmp(itemType, "RB3_TJJRevision") == 0 || strcmp(itemType, "RB3_TXTRevision") == 0 || strcmp(itemType, "RB3_WJTLRevision") == 0 || strcmp(itemType, "RB3_XJRevision") == 0 || strcmp(itemType, "RB3_XZCPRevision") == 0 || strcmp(itemType, "RB3_XZLBJRevision") == 0 || strcmp(itemType, "RB3_YCLRevision") == 0 || strcmp(itemType, "RB3_YZRevision") == 0 || strcmp(itemType, "RB3_ZCRevision") == 0)
		{
			char* itemId1 = NULL;
			AOM_ask_value_string(attachments[i], "item_id", &itemId1);
			WriteLog("itemId1：%s\n", itemId1);
			//获取子项
			tag_t top_line = NULLTAG, window = NULLTAG;
			BOM_create_window(&window);
			//设置顶层BOM
			BOM_set_window_top_line(window, NULLTAG, attachments[i], NULLTAG, &top_line);
			//获取单个的json字符串
			vector<string> parameters_vec;
			map<string, map<string, int>> classMap;
			map<string, vector<string>> factoryMap;
			WriteLog("=========================遍历获取子件信息===================\n");
			getBomLinePropertyNewRuleRelease(top_line, c_sql_values, &parameters_vec, classMap, factoryMap, unitMap, errMsg, itemId1);
			if (errMsg.size() > 0) {
				EMH_store_error_s2(EMH_severity_error, 919031, errMsg.c_str(), "失败");

				DOFREE(itemType);
				MEM_free(attachments);
				MEM_free(c_sql_values);

				//发邮件
				WriteLog("发送邮件：%d", user_cnt);
				for (int i = 0; i < user_cnt; i++) {
					char cmd[10240] = ""; // 64KB
					char jarfile[512] = "";
					string mail_addr = mail_addrs[i];
					if (mail_addr.size() > 0) {
						WriteLog(">> %d. 发送邮件给[%s]", i + 1, mail_addr.c_str());
						sprintf(jarfile, "%s\\bin\\EMailSender.jar", getenv("TC_ROOT"));
						strcpy_s(cmd, "java -jar ");
						strcat_s(cmd, jarfile);
						strcat_s(cmd, " \"");
						strcat_s(cmd, mail_addr.c_str());
						strcat_s(cmd, "\" \"【TeamCenter】传递ERP-BOM提醒\" \"");
						strcat_s(cmd, job_name);
						strcat_s(cmd, ":组织数据失败->");
						strcat_s(cmd, errMsg.c_str());
						strcat_s(cmd, "\"");
						WriteLog("CMD：%s", cmd);
						system(cmd);
						WriteLog("执行完成");
					}
					DOFREE(cmd);
				}
				CloseLog();
				return EPM_nogo;
			}


			DOFREE(itemType);
			char parameters[100000] = "";//写入到文件的值
			strcat(parameters, "{\"data\":[");
			for (int i = 0; i < parameters_vec.size(); i++)
			{
				strcat(parameters, parameters_vec[i].c_str());
				if (i < parameters_vec.size() - 1) {
					strcat(parameters, ",");
				}
			}
			strcat(parameters, "],\"control\":{\"keydata\":null,\"ifid\": null,\"ifno\":\"JDE_MDM_BOM_01\",\"suser\": null,\"sysid\": null}}");
			//获取当前时间
			time_t now = time(0);
			tm* p = localtime(&now);

			char date[128] = "";
			sprintf_s(date, "%04d%02d%02d%02d%02d%02d", 1900 + p->tm_year, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);

			//把数据用写入文件
			char data_file[SS_MAXPATHLEN] = "";
			strcat(data_file, tc_root_file);
			strcat(data_file, "\\");
			strcat(data_file, date);
			strcat(data_file, ".txt");
			WriteLog("data_file: %s\n", data_file);
			ofstream file;
			file.open(data_file);
			file << parameters << endl; // 使用与cout同样的方式进行写入
			file.close();

			string strResult;

			//cmd指令
			char cmd[256] = "";
			strcpy(cmd, "java -jar \"");
			////strcat(cmd, jar_file);
			strcat(cmd, tc_root_file);
			strcat(cmd, "\\portal\\plugins\\");
			strcat(cmd, "RB_SendErp_New.jar");
			strcat(cmd, "\" ");
			//传参
			//cout << data_file << endl;
			strcat(cmd, data_file);
			//用来传递本流程的流程名称(@分割)
			strcat(cmd, "@BOM");
			//strcat(cmd,handler_name);
			//WriteLog("路径:\n%s\n", cmd);
			char buf[8000] = { 0 };
			FILE* pf = NULL;
			if ((pf = _popen(cmd, "r")) == NULL) {
				WriteLog("接口返回:\n%s", "1");
			}

			while (fgets(buf, sizeof buf, pf)) {
				strResult += buf;
			}
			_pclose(pf);

			cout << strResult << endl;
			unsigned int iSize = strResult.size();
			if (iSize > 0 && strResult[iSize - 1] == '\n' && strlen(parameters) > 0)
			{
				strResult = strResult.substr(0, iSize - 1);
				cout << strResult << endl;
				if (strstr(strResult.c_str(), "\"code\":200") != NULL)
				{
					WriteLog("下发成功\n");


				}
				else {
					ifail = EPM_nogo;
					strcat(errorMessage, strResult.c_str());

					WriteLog("发送邮件：%d", user_cnt);
					for (int i = 0; i < user_cnt; i++) {
						char cmd[10240] = ""; // 64KB
						char jarfile[512] = "";
						string mail_addr = mail_addrs[i];
						if (mail_addr.size() > 0) {
							WriteLog(">> %d. 发送邮件给[%s]", i + 1, mail_addr.c_str());
							sprintf(jarfile, "%s\\bin\\EMailSender.jar", getenv("TC_ROOT"));
							strcpy_s(cmd, "java -jar ");
							strcat_s(cmd, jarfile);
							strcat_s(cmd, " \"");
							strcat_s(cmd, mail_addr.c_str());
							strcat_s(cmd, "\" \"【TeamCenter】传递ERP-BOM提醒\" \"");
							strcat_s(cmd, job_name);
							strcat_s(cmd, ":发送数据失败->");
							strcat_s(cmd, errorMessage);
							strcat_s(cmd, "\"");
							WriteLog("CMD：%s", cmd);
							system(cmd);
							WriteLog("执行完成");
						}
						DOFREE(cmd);
					}
				}
			}
			DOFREE(itemType);
		}
	}

	MEM_free(attachments);
	MEM_free(c_sql_values);
	if (ifail == EPM_nogo)
	{
		EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, errorMessage);

	}
	WriteLog("=========================BOM下发到ERP rule Release End===================\n");
	CloseLog();
	return ifail;
}