#define _CRT_SECURE_NO_WARNINGS #include "epm_handler_common.h" #define DOFREE(obj) \ { \ if(obj) \ { \ MEM_free(obj); \ obj = NULL; \ } \ } bool create_adhoc_signoff(tag_t current_task, vector user) { //获取任务负责人 int perform_count = 0; tag_t * perform_attaches = NULLTAG; AOM_ask_value_tags(current_task, "valid_signoffs", &perform_count, &perform_attaches); for (int i = 0; i < user.size(); i++) { int signoff_cnt = 0; tag_t * signoffs = NULLTAG; tag_t tmp_select_signoff_task = NULLTAG; if (user[i] != NULLTAG) { bool isHave = false; //判断是否已包含指定人员 if (perform_count > 0) { for (int j = 0; j < perform_count; j++) { tag_t user_tag = NULLTAG; AOM_ask_value_tag(perform_attaches[j], "fnd0Assignee", &user_tag); if (user_tag != NULL_TAG) { //判断userID是否相同 char * user_id = NULL; SA_ask_user_identifier2(user_tag, &user_id); char * checkUser_id = NULL; SA_ask_user_identifier2(user[i], &checkUser_id); if (strcmp(user_id, checkUser_id) == 0) { isHave = true; DOFREE(user_id); DOFREE(checkUser_id); break; } DOFREE(user_id); DOFREE(checkUser_id); } } } if (isHave) { DOFREE(signoffs); continue; } EPM_ask_sub_task(current_task, EPM_select_signoff_team_task, &tmp_select_signoff_task); if (tmp_select_signoff_task != NULLTAG) { EPM_create_adhoc_signoff(tmp_select_signoff_task, user[i], &signoff_cnt, &signoffs); EPM_set_adhoc_signoff_selection_done(tmp_select_signoff_task, true); //EPM_trigger_action(tmp_select_signoff_task, EPM_complete_action, ""); } else { //更改执行人 AOM_lock(current_task); AOM_set_value_tag(current_task, "fnd0Performer", user[i]); AOM_save(current_task); AOM_unlock(current_task); AOM_refresh(current_task, FALSE); } } DOFREE(signoffs); } return true; } void TCFindItem(char * queryName, int n_entries,char ** qry_entries,char ** qry_values, int * n_found, tag_t ** dba_mbrs) { tag_t query = NULLTAG; QRY_find2(queryName, &query); QRY_execute(query, n_entries, qry_entries, qry_values, n_found, dba_mbrs); } char * getLovKey(int theAttrId, char * value) { char* key_lov_name; int options = 0; int n_lov_entries = 0; char** lov_keys; char** lov_values; logical* deprecated_staus; char* owning_site; int n_shared_sites = 0; char** shared_sites; char* format = NULL; ICS_attribute_ask_property(theAttrId, "FORMAT1", &format); ICS_keylov_get_keylov(format, &key_lov_name, &options, &n_lov_entries, &lov_keys, &lov_values, &deprecated_staus, &owning_site, &n_shared_sites, &shared_sites); if (n_lov_entries > 0) { for (int q = 0; q < n_lov_entries; q++) { if (strcmp(value, lov_values[q]) == 0) { printf("lov_values[q]%s\n", value); printf("lov_keys[q]%s\n", lov_keys[q]); value = lov_keys[q]; break; } } } return value; } char * getClassProperty(tag_t item, char * propertyName) { char * result = ""; tag_t ico_tag = NULLTAG; ICS_ask_classification_object(item, &ico_tag); int theAttributeCount, *theAttributeIds, *theAttributeValCounts; char ***theAttributeValues; ICS_ico_ask_attributes(ico_tag, &theAttributeCount, &theAttributeIds, &theAttributeValCounts, &theAttributeValues); for (int t = 0; t < theAttributeCount; t++) { char theAttributeId[20] = "\0"; printf("theAttributeIds=%d ,theAttributeValCounts=%d\n", theAttributeIds[t], theAttributeValCounts[t]); sprintf(theAttributeId, "%d", theAttributeIds[t]); if (theAttributeValCounts[t]>0 && strcmp(theAttributeId, propertyName) == 0) { printf("icoLineCode=%s\n", theAttributeValues[t][0]); result = theAttributeValues[t][0];//getLovKey(theAttributeIds[t], theAttributeValues[t][0]); break; } } return result; } void TCGetPropertyValue(tag_t item,char * type,char * propertyName,char ** propertyValue) { //判断是否包含.号 if (strstr(propertyName, ".") != NULL) { //根据等号拆分条件和值 int itemPropertyCount = 0; char ** itemPropertyChar = new char *[64]; //分割字符串 split(propertyName, ".", itemPropertyChar, &itemPropertyCount); char * itemAddress = itemPropertyChar[0]; if (strcmp(type, "Revision") == NULL) { //传进来的是版本 if (strcmp(itemAddress, "item") == 0) { ITEM_ask_item_of_rev(item, &item); } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(item, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { AOM_ask_value_tag(item, itemPropertyChar[i], &item); } } if (strcmp(itemAddress, "class") == 0) { *propertyValue = getClassProperty(item, itemPropertyChar[itemPropertyCount - 1]); } else { if (item == NULL_TAG) { *propertyValue = ""; } else { AOM_UIF_ask_value(item, itemPropertyChar[itemPropertyCount - 1], propertyValue); } } } else if (strcmp(type, "BOMLine") == NULL) { tag_t revisions = NULLTAG; AOM_ask_value_tag(item, "bl_line_object", &revisions); //传进来的是对象 if (strcmp(itemAddress, "item") == 0) { ITEM_ask_item_of_rev(revisions, &item); } else if (strcmp(itemAddress, "rev") == 0) { item = revisions; } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { AOM_ask_value_tag(item, itemPropertyChar[i], &item); } } if (strcmp(itemAddress, "class") == 0) { *propertyValue = getClassProperty(revisions, itemPropertyChar[itemPropertyCount - 1]); } else { if (item == NULL_TAG) { *propertyValue = ""; } else { AOM_UIF_ask_value(item, itemPropertyChar[itemPropertyCount - 1], propertyValue); } } } else if (strcmp(type, "Item") == NULL) { tag_t revisions = NULLTAG; ITEM_ask_latest_rev(item, &revisions); //传进来的是对象 if (strcmp(itemAddress, "rev") == 0) { item = revisions; } else if (strcmp(itemAddress, "revMaster") == 0) { tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG; int form_count = 0; //获取版本表单 GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type); GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list); if (form_count == 0) { printf("未找到form,继续..."); } else { item = form_list[form_count - 1]; } DOFREE(form_list); } //判断拆分出的数量是否大于2 if (itemPropertyCount > 2) { //遍历查找关系对象 for (int i = 1; i < itemPropertyCount - 1; i++) { AOM_ask_value_tag(item, itemPropertyChar[i], &item); } } if (strcmp(itemAddress, "class") == 0) { *propertyValue = getClassProperty(revisions, itemPropertyChar[itemPropertyCount - 1]); } else { if (item == NULLTAG) { *propertyValue = ""; } else { AOM_UIF_ask_value(item, itemPropertyChar[itemPropertyCount - 1], propertyValue); //char * type = NULL; //AOM_ask_value_string(item, "object_type", &type); ////获取对象类型 //tag_t tAttrID = NULLTAG; //POM_attr_id_of_attr(itemPropertyChar[itemPropertyCount - 1], type, &tAttrID); //if (tAttrID == NULLTAG) //{ // *propertyValue = ""; //} //else //{ // AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], propertyValue); //} } } } } else { *propertyValue = propertyName; } } void BOMSendToWeixin(char * userId, tag_t rootTask_tag, string message) { string jsonStr("{\\\"touser\\\":\\\""), strResult; jsonStr.append(userId); if (rootTask_tag != NULLTAG) { jsonStr.append("\\\",\\\"msgtype\\\":\\\"text\\\",\\\"agentid\\\":1000060,\\\"text\\\":{\\\"content\\\":\\\"BOM发送到ERP失败。\\n流程发起者:【"); //获取流程发起者 tag_t owning_user = NULLTAG; char * owning_id = NULL, *process_name = NULL; AOM_ask_owner(rootTask_tag, &owning_user); SA_ask_user_identifier2(owning_user, &owning_id); jsonStr.append(owning_id); jsonStr.append("】\\n流程名称:【"); //获取流程名称 EPM_ask_name2(rootTask_tag, &process_name); jsonStr.append(process_name); DOFREE(owning_id); DOFREE(process_name); } else { jsonStr.append("\\\",\\\"msgtype\\\":\\\"text\\\",\\\"agentid\\\":1000060,\\\"text\\\":{\\\"content\\\":\\\"使用菜单BOM发送到ERP失败。\\n"); } jsonStr.append("】\\n异常日志:【"); jsonStr.append(message); jsonStr.append("】"); jsonStr.append("\\\"}}"); char toJar[1000] = ""; strcat(toJar, "java -jar "); strcat(toJar, "C:\\PLM\\sendToWeixin.jar "); strcat(toJar, jsonStr.c_str()); //system(toJar); //_popen(toJar, "r"); char buf[8000] = { 0 }; FILE *pf = NULL; if ((pf = _popen(toJar, "r")) == NULL) { printf("接口返回:\n%s", "1"); } while (fgets(buf, sizeof buf, pf)) { strResult += buf; } _pclose(pf); cout << strResult << endl; } void itemSendToWeixin(char * userId, tag_t rootTask_tag, string message) { string jsonStr("{\\\"touser\\\":\\\""), strResult; jsonStr.append(userId); jsonStr.append("\\\",\\\"msgtype\\\":\\\"text\\\",\\\"agentid\\\":1000060,\\\"text\\\":{\\\"content\\\":\\\"物料发送到ERP失败。\\n流程发起者:【"); //获取流程发起者 tag_t owning_user = NULLTAG; char * owning_id = NULL, *process_name = NULL; AOM_ask_owner(rootTask_tag, &owning_user); SA_ask_user_identifier2(owning_user, &owning_id); jsonStr.append(owning_id); jsonStr.append("】\\n流程名称:【"); //获取流程名称 EPM_ask_name2(rootTask_tag, &process_name); jsonStr.append(process_name); jsonStr.append("】\\n异常日志:【"); jsonStr.append(message); jsonStr.append("】"); jsonStr.append("\\\"}}"); char toJar[1000] = ""; strcat(toJar, "java -jar "); strcat(toJar, "C:\\PLM\\sendToWeixin.jar "); strcat(toJar, jsonStr.c_str()); //system(toJar); //_popen(toJar, "r"); char buf[8000] = { 0 }; FILE *pf = NULL; if ((pf = _popen(toJar, "r")) == NULL) { printf("接口返回:\n%s", "1"); } while (fgets(buf, sizeof buf, pf)) { strResult += buf; } _pclose(pf); cout << strResult << endl; DOFREE(owning_id); DOFREE(process_name); } void GetFiles(string path, vector& files) { //文件句柄 long hFile = 0; //文件信息 struct _finddata_t fileinfo; std::string p; if ((hFile = _findfirst(p.assign(path).append("/*").c_str(), &fileinfo)) != -1) { do { //如果是目录,迭代之 //如果不是,加入列表 if ((fileinfo.attrib & _A_SUBDIR)) { if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) GetFiles(p.assign(path).append("/").append(fileinfo.name), files); } else { files.push_back(p.assign(path).append("/").append(fileinfo.name)); } } while (_findnext(hFile, &fileinfo) == 0); _findclose(hFile); } } LPCWSTR stringToLPCWSTR(std::string orig) { /*size_t origsize = orig.length() + 1; const size_t newsize = 100; size_t convertedChars = 0; wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*(orig.length() - 1)); mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE); return wcstring;*/ int len; int slength = (int)orig.length() + 1; len = MultiByteToWideChar(CP_ACP, 0, orig.c_str(), slength, 0, 0); wchar_t* buf = new wchar_t[len]; MultiByteToWideChar(CP_ACP, 0, orig.c_str(), slength, buf, len); //std::wstring r(buf); ///delete[] buf; //LPCWSTR result = r.c_str(); return buf; } const char * inputFileToFtp(char * filePath) { string ftpFilePath = NULL; //ftp地址 string ftpSvrIp = "10.18.1.105"; //ftp端口 int port = 21; //用户名 string userName = "Administrator"; //用户密码 string password = "PlmTst_8023"; //上传文件源路径 string sourceFilePath = filePath; //上传文件目的路径 string resultFilePath = "/工位SOP文件/"; string desFilePath = "./工位SOP文件/"; vector files; //判断上传的是文件还是文件夹标识 int size = 0; if (sourceFilePath.find(".") == string::npos) { //获取文件夹下所有文件名 GetFiles(sourceFilePath, files); char str[30]; size = files.size(); } HINTERNET hint = NULL; HINTERNET hftp = NULL; do { hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); if (hint == NULL) { break; } //创建ftp连接 hftp = InternetConnect(hint, stringToLPCWSTR(ftpSvrIp), port, stringToLPCWSTR(userName), stringToLPCWSTR(password), INTERNET_SERVICE_FTP, 0, 0); if (hftp == NULL) { break; } //如果目的路径不存在,一级一级创建 //目的路径格式为:"./dir/dir1/.../" int pos = 1; string tempPath; while (pos>0) { // 从第二个“/”开始依次找到目的路径中的“/”位置 pos = desFilePath.find_first_of('/', pos + 1); if (pos == -1) break; tempPath = desFilePath.substr(0, pos + 1); if (_access(tempPath.c_str(), 0) == -1) { FtpCreateDirectory(hftp, stringToLPCWSTR(tempPath)); } } //如果FtpSetCurrentDirectory一直报错,看一下desFilePath路径是否创建成功,用资源管理器看能否直接访问ftp if (FtpSetCurrentDirectory(hftp, stringToLPCWSTR(desFilePath))) { //上传文件源为一个文件 if (0 == size) { //获取上传路径中的文件名 int pos = sourceFilePath.find_last_of('/'); string desfilename = sourceFilePath.substr(pos + 1); int i = FtpPutFile(hftp, stringToLPCWSTR(sourceFilePath), stringToLPCWSTR(desfilename), FTP_TRANSFER_TYPE_BINARY, 0); } //上传文件源为文件夹 else { for (int i = 0; i < size; i++) { std::string tempFilePath = files[i].c_str(); //获取上传路径中的文件名 int pos = tempFilePath.find_last_of('/'); string desfilename = tempFilePath.substr(pos + 1); //desfilename = desFilePath + desfilename; int result = FtpPutFile(hftp, stringToLPCWSTR(tempFilePath), stringToLPCWSTR(desfilename), FTP_TRANSFER_TYPE_ASCII, 0); if (result == 0) { printf("上传文件失败!\n"); return NULL; } else { ftpFilePath = "FTP://" + ftpSvrIp + resultFilePath + desfilename; } } } } } while (0); InternetCloseHandle(hftp); InternetCloseHandle(hint); if (ftpFilePath.length() > 0) { cout << "上传文件完成" << endl; } return ftpFilePath.c_str(); } char * getLineCode(char * lineCode) { char * result = "ALL"; int theCount1; char **theICOUIDs, **theICOIds, **theClassIds, **theWSOUIDs; tag_t *theICOTags, *theWSOTags; ICS_class_ask_icos("组计数器字典", "", &theCount1, &theICOTags, &theICOUIDs, &theICOIds, &theClassIds, &theWSOTags, &theWSOUIDs); printf("theCount1=%d\n", theCount1); int theAttributeCount, *theAttributeIds, *theAttributeValCounts; char ***theAttributeValues; for (int m = 0; m < theCount1; m++) { ICS_ico_ask_attributes(theICOTags[m], &theAttributeCount, &theAttributeIds, &theAttributeValCounts, &theAttributeValues); printf("theICOIds=%s,theICOUID==%s\n", theICOIds[m], theICOUIDs[m]); char * icoLineCode = NULL; char * icoERPCode = NULL; for (int t = 0; t < theAttributeCount; t++) { char theAttributeId[20] = "\0"; printf("theAttributeIds=%d ,theAttributeValCounts=%d\n", theAttributeIds[t], theAttributeValCounts[t]); sprintf(theAttributeId, "%d", theAttributeIds[t]); if (theAttributeValCounts[t]>0 && strcmp(theAttributeId,"1002") == 0) { printf("icoLineCode=%s\n", theAttributeValues[t][0]); icoLineCode = theAttributeValues[t][0]; } else if (theAttributeValCounts[t]>0 && strcmp(theAttributeId, "1101") == 0) { printf("icoERPCode=%s\n", theAttributeValues[t][0]); icoERPCode = theAttributeValues[t][0]; } } if (strcmp(lineCode, icoLineCode) == 0 && icoERPCode != NULL && strcmp(icoERPCode, "") != 0) { result = icoERPCode; break; } } return result; } char* removeSpaces(char* str) { int i, j; // 对字符串进行迭代,查找非空字符并复制到前面的位置 for (i = j = 0; str[i] != '\0'; i++) if (str[i] != ' ') str[j++] = str[i]; // 在末尾添加'\0'来结束新字符串 str[j] = '\0'; return str; } char* removeChar(char* str, char charToRemove) { char* newStr = str; char* p = str; while (*p) { if (*p != charToRemove) { *newStr++ = *p; } p++; } *newStr = '\0'; // 添加字符串终止符 return str; } void removeFirstFourChars(char* str) { if (str == nullptr) return; char* newStart = std::next(str, 4); // 获取新的起始位置 std::copy(newStart, str + std::strlen(str), str); // 拷贝剩余字符 *std::strrchr(str, '\0') = '\0'; // 修正字符串末尾 } bool startsWith(const char* str, char first, char second) { return str && str[0] == first && str[1] == second; } char* getFirstStr(const char* str, int index) { if (str == nullptr) { return nullptr; } int length = strlen(str); if (length <= index) { // 创建新的字符串并复制内容 char* result = new char[length + 1]; strcpy(result, str); return result; } else { // 创建新的字符串并复制前四个字符 char* result = new char[index + 1]; strncpy(result, str, index); result[index] = '\0'; // 添加字符串结束标记 return result; } } //获取分类属性 void getClassValue(char* value, int id, char** disValue) { //printf("===================================\n"); //printf("获取分类属性 开始\n"); //printf("===================================\n"); char* format = NULL; ITKCALL(ICS_attribute_ask_property(id, "FORMAT1", &format)); //printf(">> Format: %s\n", format); if (format != NULL && strcmp("", format) != 0 && strcmp(" ", format) != 0) { char* key_lov_name; int options = 0; int n_lov_entries = 0; char** lov_keys; char** lov_values; logical* deprecated_staus; char* owning_site; int n_shared_sites = 0; char** shared_sites; ICS_keylov_get_keylov(format, &key_lov_name, &options, &n_lov_entries, &lov_keys, &lov_values, &deprecated_staus, &owning_site, &n_shared_sites, &shared_sites); //printf(">> 下拉值数量: %d\n", n_lov_entries); if (n_lov_entries == 0) { *disValue = value; } else { for (int j = 0; j < n_lov_entries; j++) { if (strcmp(value, lov_keys[j]) == 0) { //printf("lov的选值=>:[%s]\n", lov_values[j]); *disValue = lov_values[j]; break; } } if (key_lov_name != NULL) { DOFREE(key_lov_name); } if (lov_keys != NULL) { DOFREE(lov_keys); } if (lov_values != NULL) { DOFREE(lov_values); } if (deprecated_staus != NULL) { DOFREE(deprecated_staus); } if (owning_site != NULL) { DOFREE(owning_site); } if (shared_sites != NULL) { DOFREE(shared_sites); } } } if (format != NULL) { DOFREE(format); } //printf("===================================\n"); //printf("获取分类属性 结束\n"); //printf("===================================\n"); }