#pragma warning (disable: 4996) #pragma warning (disable: 4819) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tc_util.h" #include "tc_log.h" #include #include #include #include "string_utils.h" #include "tinyxml.h" #include "ado.h" #include #include using namespace std; extern "C" int POM_AM__set_application_bypass(logical bypass); string readXML(map, vector>> &xmlMap, string xmlPath) { time_t currentTime; struct tm *timeInfo; char timeString[80]; // 获取当前时间 time(¤tTime); // 将时间转换为本地时间 timeInfo = localtime(¤tTime); TiXmlDocument* pDoc = new TiXmlDocument(); pDoc->LoadFile(xmlPath.c_str()); //pDoc->Print(); //获取根节点 TiXmlElement* pRoot = pDoc->RootElement(); string rootName = pRoot->Value(); string t_Item_info = rootName;// //获取Item标签 TiXmlElement* itemElement = pRoot->FirstChildElement("ITEM");//物料类型 string itemLable = itemElement->Value(); TiXmlElement *nextItemElement = itemElement; //循环遍历根节点下的兄弟节点 char type[50] = ""; char sessionId[50] = ""; char transNowTime[50] = ""; char transStatus[50] = ""; char itemId[50] = ""; char itemRev[50] = ""; char itemName[50] = ""; char itemRelease[50] = ""; while (nextItemElement) { map, vector> propertyMap;//字段名集合,值的集合 vector nameVec; vector valueVec; const char* attribute_value = nextItemElement->Attribute("type"); if (attribute_value == NULL) { strcpy(type, "通用"); } else { strcpy(type, attribute_value); } WriteLog("type=%s\n", type); string materialType = type; TiXmlElement* pChild = nextItemElement->FirstChildElement(); if (pChild != NULL) { string childLabnelName = pChild->Value(); attribute_value = pChild->Attribute("val"); strcpy(sessionId, attribute_value); // 将 str 复制给 copy string tempValue = sessionId; nameVec.push_back(childLabnelName); valueVec.push_back(tempValue); } pChild = pChild->NextSiblingElement(); while (true) { if (pChild != NULL) { string childLabnelName = pChild->Value(); attribute_value = pChild->Attribute("val"); strcpy(sessionId, attribute_value); // 将 str 复制给 copy string tempValue = sessionId; nameVec.push_back(childLabnelName); if (strcmp("TRANSNO", childLabnelName.c_str()) == 0) { strftime(timeString, sizeof(timeString), sessionId, timeInfo); tempValue = timeString; } valueVec.push_back(tempValue); } ; pChild = pChild->NextSiblingElement(); if (pChild == NULL) { break; } } propertyMap[nameVec] = valueVec; xmlMap[materialType] = propertyMap; nextItemElement = nextItemElement->NextSiblingElement(); } delete pDoc;// return t_Item_info; } /** * 去掉字符串首尾的单引号 */ void removeQuotes(char* tempValue) { if (tempValue == nullptr) return; size_t len = strlen(tempValue); // 移除开头的单引号 if (len > 0 && tempValue[0] == '\'') { memmove(tempValue, tempValue + 1, len); len--; } // 移除末尾的单引号 if (len > 0 && tempValue[len - 1] == '\'') { tempValue[len - 1] = '\0'; } } int JD_ItemInfoToMediDatabase(EPM_action_message_t msg) { bool showError = false; nowTime(); time_t now; struct tm *p; //获取当前时间 time(&now); //本地化时间,可以细分为年月日时分秒等 p = localtime(&now); char TC_LOG_FILE[128] = ""; createDir();//创建日志目录 // 把日志名称赋予给某变量 sprintf_s(TC_LOG_FILE, "%s\\tmplog\\JD_ItemInfoToMediDatabase_log_[%d-%d-%d-%d-%02d-%02d].txt", getenv("TEMP"), 1900 + p->tm_year, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min,p->tm_sec); ECHO("创建日志文件[%s]\n", TC_LOG_FILE); CreateLogFile(TC_LOG_FILE); //流程节点相关 tag_t root_task = NULLTAG, *sub_tasks = NULL, current_task = NULLTAG, type_tag = NULLTAG; int arg_cnt = 0, ifail = 0; char arg1value[1024] = "";//物料类型 char *argflag = NULL, *argvalue = NULL, *arg = NULL; //得到触发此函数的节点 current_task = msg.task; WriteLog("=========================================================\n"); WriteLog("JD_ItemInfoToMediDatabase 开始执行\n"); WriteLog("=========================================================\n"); //获取handler的参数的个数 arg_cnt = TC_number_of_arguments(msg.arguments); WriteLog("参数个数为:%d\n", arg_cnt); if (arg_cnt > 0) { for (int i = 0; i < arg_cnt; i++) { //获取下一个参数(从0开始) arg = TC_next_argument(msg.arguments); //获取参数的名称和值 ifail = ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue); if (stricmp(argflag, "PartItem") == 0) { if (argvalue != NULL) { strcpy(arg1value, argvalue); } } } MEM_free(argflag); MEM_free(argvalue); } //先获取首选项Jd_Erp_Info_Connect,解析其中的用户名,密码,配置文件等信息 vector pref_vec1; getPrefStrings1("Jd_Erp_Info_Connect_Test", TC_preference_site, pref_vec1); string ip = pref_vec1[0]; string databaseName = pref_vec1[1]; string user = pref_vec1[2]; string password = pref_vec1[3]; string xmlUid = pref_vec1[4]; WriteLog("ip:%s\n", ip.c_str()); WriteLog("databaseName:%s\n", databaseName.c_str()); WriteLog("user:%s\n", user.c_str()); WriteLog("password:%s\n", password.c_str()); WriteLog("xmlUid:%s\n", xmlUid.c_str()); ado ado0; char userName[100]; strcpy(userName, user.c_str()); char pwd[100]; strcpy(pwd, password.c_str()); string info = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog="; info.append(databaseName).append(";Data Source=").append(ip); WriteLog("连接信息:%s\n", info.c_str()); bool log = ado0.open(userName, pwd, info.c_str()); tag_t wlinfoXml = NULL; ITK__convert_uid_to_tag(xmlUid.c_str(), &wlinfoXml); //获取文件 char *temp_dir = getenv("temp");//获得缓存路径 char output_file_xml_temp[SS_MAXPATHLEN] = ""; strcpy(output_file_xml_temp, temp_dir); strcat(output_file_xml_temp, "\\"); strcat(output_file_xml_temp, xmlUid.c_str()); strcat(output_file_xml_temp, ".xml"); if (access(output_file_xml_temp, 0) == 0) {//存在 if (remove(output_file_xml_temp) == 0) { cout << "exist" << output_file_xml_temp << "delete" << endl; } } POM_AM__set_application_bypass(true); ITKCALL(AE_export_named_ref(wlinfoXml, "XMLRendering", output_file_xml_temp)); POM_AM__set_application_bypass(false); string path = output_file_xml_temp; //解析xml文件 //创建一个XML结构并载入文件内容 map, vector>> xmlMap;//物料类型,<字段名,属性取值> string tableName = readXML(xmlMap, path); WriteLog("中间表:%s\n", tableName.c_str()); //遍历map所有层级 string revType = arg1value; vector revTypeVec; Split(revType, ";", revTypeVec); int att_cnt = 0; tag_t *attachments = NULL; //获取根流程节点 tag_t task_tag = msg.task; tag_t rootTask_tag = NULL; ifail = EPM_ask_root_task(task_tag, &rootTask_tag); vector insertVec; vector updateVec; vector selectVec; vector selectAfterUpdateVec; //获取目标引用对象 ifail = EPM_ask_attachments(rootTask_tag, EPM_target_attachment, &att_cnt, &attachments); for (int i = 0; i < att_cnt; i++) { char *object_TYPE_1 = NULL; ifail = AOM_ask_value_string(attachments[i], "object_type", &object_TYPE_1);//对象类型 WriteLog("当前类型对象为 %s\n", object_TYPE_1); string partType = object_TYPE_1; if (hasElement(revTypeVec, partType) == 0) { // string sqlStr = "insert into "; string updateStr = "update "; string selectStr = "select * from "; string selectAfterUpdateStr = "select * from "; string updateWhere = ""; sqlStr = sqlStr.append(tableName).append(" ("); selectStr = selectStr.append(tableName).append(" "); selectAfterUpdateStr = selectAfterUpdateStr.append(tableName).append(" "); string valueStr = " VALUES ("; //包含类型,连接数据库 if (log == false) { cout << "登陆成功" << endl; tag_t partItem = NULL; ITEM_ask_item_of_rev(attachments[i], &partItem); char *itemType = NULL; AOM_ask_value_string(partItem, "object_type", &itemType); string itemTypeString = itemType; map, vector> propertyMap; propertyMap = xmlMap[itemType]; if (propertyMap.size() == 0) { propertyMap = xmlMap["通用"]; } map, vector>::iterator rev_it2; for (rev_it2 = propertyMap.begin(); rev_it2 != propertyMap.end(); rev_it2++) { vector nameVec = rev_it2->first; vector valueVec = rev_it2->second; for (int j = 0; j < nameVec.size(); j++) { string columnName = nameVec[j]; string columnValue = valueVec[j]; WriteLog("字段名 %s, 取值 %s\n", columnName.c_str(), columnValue.c_str()); WriteLog("字段名 %s, 取值 %s\n", columnName.c_str(), columnValue.c_str()); sqlStr = sqlStr.append(columnName); if (strcmp(columnName.c_str(), "TRANSNO") == 0) { //时间已经处理,直接获取即可 valueStr.append("'").append(columnValue).append("'"); if (updateWhere.length() == 0) { updateWhere = updateWhere.append(" where "); updateWhere = updateWhere.append(columnName).append("='").append(columnValue).append("' and "); selectStr = selectStr.append(" where "); selectStr = selectStr.append(columnName).append("='").append(columnValue).append("' and "); selectAfterUpdateStr = selectAfterUpdateStr.append(" where "); selectAfterUpdateStr = selectAfterUpdateStr.append(columnName).append("='").append(columnValue).append("' and "); } else { updateWhere = updateWhere.append(columnName).append("='").append(columnValue).append("'"); selectStr = selectStr.append(columnName).append("='").append(columnValue).append("'"); selectAfterUpdateStr = selectAfterUpdateStr.append(columnName).append("='").append(columnValue).append("'"); } } else if (strcmp(columnName.c_str(), "SESSIONID") == 0) { //固定值,直接获取即可 valueStr.append("'").append(columnValue).append("'"); } else if (strcmp(columnName.c_str(), "TRANSSTATUS") == 0) { //不做任何处理,但在传递完毕后更新 updateStr = updateStr.append(tableName).append(" set ").append(columnName).append("='").append(columnValue).append("' "); selectAfterUpdateStr = selectAfterUpdateStr.append(columnName).append("='").append(columnValue).append("' and "); valueStr.append("'").append(" ").append("'"); } else if (strcmp(columnName.c_str(), "PUID") == 0) { //获取所有发布状态release_status_list char *puid = NULL; ITK__convert_tag_to_uid(attachments[i], &puid); string puidString = puid; valueStr.append("'").append(puid).append("'"); if (updateWhere.length() == 0) { updateWhere = updateWhere.append(" where "); updateWhere = updateWhere.append(columnName).append("='").append(puid).append("' and "); selectStr = selectStr.append(" where "); selectStr = selectStr.append(columnName).append("='").append(columnValue).append("' and "); selectAfterUpdateStr = selectAfterUpdateStr.append(" where "); selectAfterUpdateStr = selectAfterUpdateStr.append(columnName).append("='").append(columnValue).append("' and "); } else { updateWhere = updateWhere.append(columnName).append("='").append(puid).append("'"); selectStr = selectStr.append(columnName).append("='").append(puid).append("'"); selectAfterUpdateStr = selectAfterUpdateStr.append(columnName).append("='").append(puid).append("'"); } DOFREE(puid); } else { //其他情况获取属性 vector vec; if (columnValue.size() > 0) { Split(columnValue, ".", vec); char *tempValue = NULL; if (vec.size() == 2) { tag_t objTag = NULL; if (strcmp(vec[0].c_str(), "item") == 0) { objTag = partItem; } else if (strcmp(vec[0].c_str(), "rev") == 0) { objTag = attachments[i]; } //需要注意,如果属性不存在或者说不准确,就传空值 ITKCALL(ifail= AOM_UIF_ask_value(objTag, vec[1].c_str(), &tempValue)); removeQuotes(tempValue); string tempValueString = " "; if (ifail == 0) { tempValueString = tempValue; }else { showError = true; WriteLog("属性异常:%s\n", vec[1].c_str()); } EMH_clear_errors(); valueStr.append("'").append(tempValueString).append("'"); } DOFREE(tempValue); } else { valueStr.append("' '"); } } if (j < nameVec.size() - 1) { valueStr.append(","); sqlStr = sqlStr.append(","); } else { valueStr.append(")"); sqlStr = sqlStr.append(") "); } } } sqlStr = sqlStr.append(valueStr); //正式系统编码utf-8,测试系统gbk updateStr = updateStr.append(updateWhere); sqlStr = Utf8ToGbk(sqlStr.c_str()); updateStr = Utf8ToGbk(updateStr.c_str()); selectStr= Utf8ToGbk(selectStr.c_str()); selectAfterUpdateStr = Utf8ToGbk(selectAfterUpdateStr.c_str()); WriteLog("gbk插入语句:%s\n", sqlStr.c_str()); WriteLog("更新语句:%s\n", updateStr.c_str()); WriteLog("查询语句:%s\n", selectStr.c_str()); WriteLog("更新后查询语句:%s\n", selectAfterUpdateStr.c_str()); insertVec.push_back(sqlStr); updateVec.push_back(updateStr); selectVec.push_back(selectStr); selectAfterUpdateVec.push_back(selectAfterUpdateStr); char sendChar[200] = ""; strcpy(sendChar, sqlStr.c_str()); char sendChar2[200] = ""; strcpy(sendChar2, selectStr.c_str()); int result = ado0.ado_QuerySQLNoInputParam(sendChar2); bool resultSql = ado0.executeInsert(sendChar2, sendChar, result); } else { cout << "登录失败" << endl; } } DOFREE(object_TYPE_1); } //更新数据库 for (int i = 0; i < updateVec.size(); i++) { string updateSql = updateVec[i]; string selectSql = selectVec[i]; string insertSql = insertVec[i]; string selectUpdate = selectAfterUpdateVec[i]; char sendChar[200] = ""; char sendChar2[200] = ""; char sendChar3[200] = ""; strcpy(sendChar, updateSql.c_str()); strcpy(sendChar2, selectSql.c_str()); strcpy(sendChar3, selectUpdate.c_str()); int result = ado0.ado_QuerySQLNoInputParam(sendChar2); if (result==0) { showError = true; WriteLog("插入失败:%s\n", insertSql.c_str()); } else { bool resultSql = ado0.execute2(sendChar2, sendChar, result); result = ado0.ado_QuerySQLNoInputParam(sendChar3); if (result == 0) { showError = true; WriteLog("更新失败:%s\n", updateSql.c_str()); } } } ado0.close(); //EMH_clear_errors(); DOFREE(attachments); //if (showError == true) { // string logName = "数据异常,详见服务器日志:"; // logName = logName.append(TC_LOG_FILE); // EMH_store_error_s1(EMH_severity_warning, EMH_AE_error_base, logName.c_str()); //} WriteLog("=========================================================\n"); WriteLog("JD_ItemInfoToMediDatabase 结束\n"); WriteLog("=========================================================\n"); return 0; }